diff --git a/DEPS b/DEPS
index 6f2235b..8344f20 100644
--- a/DEPS
+++ b/DEPS
@@ -109,7 +109,7 @@
   # 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': '626844157660a5c78c5f7e958db5c6af498ef35b',
+  'v8_revision': '80d8889e4e4eead687e2aabe7dc60c23c17bd3a1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -129,7 +129,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '7348681933306c3b407cb3756ce4f01782791fb6',
+  'pdfium_revision': '265886b2befa2a135113155937bafa9704329635',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -165,7 +165,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'fc2aa094eda427b0cff1aaff2431f3089c26932c',
+  'catapult_revision': 'cd3378c32017c99062cd467a3ff601e0b57f0c23',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -600,7 +600,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '148e225d4998297e1089faa7466e83cb998e9b5a',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'abdecf34eac97c4f2b2d2e5b2d6bea5d4b97fee1',
       'condition': 'checkout_linux',
   },
 
@@ -1106,7 +1106,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6d2f3f4cb8bac1f7c4a945c73d07a33df74f22f9',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'da67c16c81383fed826f5c74c064eeb329f331c8',
+    Var('webrtc_git') + '/src.git' + '@' + 'e8d2b1be1a7c39fd405a9f8061467008869f24bd',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1137,7 +1137,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@11e4f109593a74d0374d4c74b9ef55271c24ca39',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fbc78231d0587866b6ee16516308e11ec04823e7',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index bcdd68c..fd721444 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -476,32 +476,6 @@
     "magnifier/partial_magnification_controller.h",
     "media_controller.cc",
     "media_controller.h",
-    "message_center/arc_notification_manager_delegate_impl.cc",
-    "message_center/arc_notification_manager_delegate_impl.h",
-    "message_center/ash_message_center_lock_screen_controller.cc",
-    "message_center/ash_message_center_lock_screen_controller.h",
-    "message_center/message_center_bubble.cc",
-    "message_center/message_center_bubble.h",
-    "message_center/message_center_button_bar.cc",
-    "message_center/message_center_button_bar.h",
-    "message_center/message_center_controller.cc",
-    "message_center/message_center_controller.h",
-    "message_center/message_center_scroll_bar.cc",
-    "message_center/message_center_scroll_bar.h",
-    "message_center/message_center_style.h",
-    "message_center/message_center_ui_controller.cc",
-    "message_center/message_center_ui_controller.h",
-    "message_center/message_center_ui_delegate.h",
-    "message_center/message_center_view.cc",
-    "message_center/message_center_view.h",
-    "message_center/message_list_view.cc",
-    "message_center/message_list_view.h",
-    "message_center/notification_swipe_control_view.cc",
-    "message_center/notification_swipe_control_view.h",
-    "message_center/notifier_settings_view.cc",
-    "message_center/notifier_settings_view.h",
-    "message_center/slidable_message_view.cc",
-    "message_center/slidable_message_view.h",
     "metrics/demo_session_metrics_recorder.cc",
     "metrics/demo_session_metrics_recorder.h",
     "metrics/desktop_task_switch_metric_recorder.cc",
@@ -731,18 +705,44 @@
     "system/locale/locale_notification_controller.h",
     "system/media_security/multi_profile_media_tray_item.cc",
     "system/media_security/multi_profile_media_tray_item.h",
+    "system/message_center/arc_notification_manager_delegate_impl.cc",
+    "system/message_center/arc_notification_manager_delegate_impl.h",
+    "system/message_center/ash_message_center_lock_screen_controller.cc",
+    "system/message_center/ash_message_center_lock_screen_controller.h",
     "system/message_center/ash_popup_alignment_delegate.cc",
     "system/message_center/ash_popup_alignment_delegate.h",
     "system/message_center/fullscreen_notification_blocker.cc",
     "system/message_center/fullscreen_notification_blocker.h",
     "system/message_center/inactive_user_notification_blocker.cc",
     "system/message_center/inactive_user_notification_blocker.h",
+    "system/message_center/message_center_bubble.cc",
+    "system/message_center/message_center_bubble.h",
+    "system/message_center/message_center_button_bar.cc",
+    "system/message_center/message_center_button_bar.h",
+    "system/message_center/message_center_controller.cc",
+    "system/message_center/message_center_controller.h",
+    "system/message_center/message_center_scroll_bar.cc",
+    "system/message_center/message_center_scroll_bar.h",
+    "system/message_center/message_center_style.h",
+    "system/message_center/message_center_ui_controller.cc",
+    "system/message_center/message_center_ui_controller.h",
+    "system/message_center/message_center_ui_delegate.h",
+    "system/message_center/message_center_view.cc",
+    "system/message_center/message_center_view.h",
+    "system/message_center/message_list_view.cc",
+    "system/message_center/message_list_view.h",
     "system/message_center/new_unified_message_center_view.cc",
     "system/message_center/new_unified_message_center_view.h",
+    "system/message_center/notification_swipe_control_view.cc",
+    "system/message_center/notification_swipe_control_view.h",
     "system/message_center/notification_tray.cc",
     "system/message_center/notification_tray.h",
+    "system/message_center/notifier_settings_view.cc",
+    "system/message_center/notifier_settings_view.h",
     "system/message_center/session_state_notification_blocker.cc",
     "system/message_center/session_state_notification_blocker.h",
+    "system/message_center/slidable_message_view.cc",
+    "system/message_center/slidable_message_view.h",
     "system/message_center/unified_message_center_view.cc",
     "system/message_center/unified_message_center_view.h",
     "system/message_center/unified_message_list_view.cc",
@@ -1798,10 +1798,6 @@
     "magnifier/magnifier_test_utils.cc",
     "magnifier/magnifier_test_utils.h",
     "magnifier/partial_magnification_controller_unittest.cc",
-    "message_center/message_center_ui_controller_unittest.cc",
-    "message_center/message_center_view_unittest.cc",
-    "message_center/message_list_view_unittest.cc",
-    "message_center/notifier_settings_view_unittest.cc",
     "metrics/demo_session_metrics_recorder_unittest.cc",
     "metrics/desktop_task_switch_metric_recorder_unittest.cc",
     "metrics/login_metrics_recorder_unittest.cc",
@@ -1859,8 +1855,12 @@
     "system/message_center/arc/arc_notification_view_unittest.cc",
     "system/message_center/ash_popup_alignment_delegate_unittest.cc",
     "system/message_center/inactive_user_notification_blocker_unittest.cc",
+    "system/message_center/message_center_ui_controller_unittest.cc",
+    "system/message_center/message_center_view_unittest.cc",
+    "system/message_center/message_list_view_unittest.cc",
     "system/message_center/new_unified_message_center_view_unittest.cc",
     "system/message_center/notification_tray_unittest.cc",
+    "system/message_center/notifier_settings_view_unittest.cc",
     "system/message_center/session_state_notification_blocker_unittest.cc",
     "system/message_center/unified_message_list_view_unittest.cc",
     "system/network/auto_connect_notifier_unittest.cc",
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc
index bde967c..bf456fd 100644
--- a/ash/app_list/views/app_list_item_view.cc
+++ b/ash/app_list/views/app_list_item_view.cc
@@ -128,6 +128,7 @@
 
   // views::View:
   void OnBoundsChanged(const gfx::Rect& previous_bounds) override {
+    views::ImageView::OnBoundsChanged(previous_bounds);
     if (icon_mask_)
       icon_mask_->layer()->SetBounds(GetLocalBounds());
   }
diff --git a/ash/assistant/assistant_controller.cc b/ash/assistant/assistant_controller.cc
index df002ff..ed3f1a1 100644
--- a/ash/assistant/assistant_controller.cc
+++ b/ash/assistant/assistant_controller.cc
@@ -298,17 +298,17 @@
       Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled());
 }
 
-void AssistantController::OpenUrl(const GURL& url) {
+void AssistantController::OpenUrl(const GURL& url, bool from_server) {
   if (assistant::util::IsDeepLinkUrl(url)) {
     NotifyDeepLinkReceived(url);
     return;
   }
 
   // The new tab should be opened with a user activation since the user
-  // interacted with the assistant to open the url.
+  // interacted with the Assistant to open the url.
   Shell::Get()->new_window_controller()->NewTabWithUrl(
-      url, true /* from_user_interaction */);
-  NotifyUrlOpened(url);
+      url, /*from_user_interaction=*/true);
+  NotifyUrlOpened(url, from_server);
 }
 
 void AssistantController::NotifyConstructed() {
@@ -333,9 +333,9 @@
     observer.OnDeepLinkReceived(type, params);
 }
 
-void AssistantController::NotifyUrlOpened(const GURL& url) {
+void AssistantController::NotifyUrlOpened(const GURL& url, bool from_server) {
   for (AssistantControllerObserver& observer : observers_)
-    observer.OnUrlOpened(url);
+    observer.OnUrlOpened(url, from_server);
 }
 
 void AssistantController::OnVoiceInteractionStatusChanged(
diff --git a/ash/assistant/assistant_controller.h b/ash/assistant/assistant_controller.h
index c926fcb..3d67d7bf 100644
--- a/ash/assistant/assistant_controller.h
+++ b/ash/assistant/assistant_controller.h
@@ -130,9 +130,9 @@
   // AccessibilityObserver:
   void OnAccessibilityStatusChanged() override;
 
-  // Opens the specified |url| in a new browser tab.
-  // TODO(dmblack): Support opening specific URLs in the Assistant container.
-  void OpenUrl(const GURL& url);
+  // Opens the specified |url| in a new browser tab. Special handling is applied
+  // to deep links which may cause deviation from this behavior.
+  void OpenUrl(const GURL& url, bool from_server = false);
 
   AssistantCacheController* cache_controller() {
     DCHECK(assistant_cache_controller_);
@@ -170,7 +170,7 @@
   void NotifyConstructed();
   void NotifyDestroying();
   void NotifyDeepLinkReceived(const GURL& deep_link);
-  void NotifyUrlOpened(const GURL& url);
+  void NotifyUrlOpened(const GURL& url, bool from_server);
 
   // mojom::VoiceInteractionObserver:
   void OnVoiceInteractionStatusChanged(
diff --git a/ash/assistant/assistant_controller_observer.h b/ash/assistant/assistant_controller_observer.h
index d53568f..15c9552 100644
--- a/ash/assistant/assistant_controller_observer.h
+++ b/ash/assistant/assistant_controller_observer.h
@@ -34,8 +34,9 @@
       assistant::util::DeepLinkType type,
       const std::map<std::string, std::string>& params) {}
 
-  // Invoked when the specified |url| is opened by Assistant in a new tab.
-  virtual void OnUrlOpened(const GURL& url) {}
+  // Invoked when the specified |url| is opened by Assistant in a new tab. If
+  // |from_server| is true, this event was triggered by a server response.
+  virtual void OnUrlOpened(const GURL& url, bool from_server) {}
 
  protected:
   AssistantControllerObserver() = default;
diff --git a/ash/assistant/assistant_interaction_controller.cc b/ash/assistant/assistant_interaction_controller.cc
index 7a98f83..8c17d87 100644
--- a/ash/assistant/assistant_interaction_controller.cc
+++ b/ash/assistant/assistant_interaction_controller.cc
@@ -442,7 +442,10 @@
   if (model_.interaction_state() != InteractionState::kActive) {
     return;
   }
-  assistant_controller_->OpenUrl(url);
+  // We need to indicate that the navigation attempt is occurring as a result of
+  // a server response so that we can differentiate from navigation attempts
+  // initiated by direct user interaction.
+  assistant_controller_->OpenUrl(url, /*from_server=*/true);
 }
 
 void AssistantInteractionController::OnDialogPlateButtonPressed(
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc
index a899cff..0b1cea9 100644
--- a/ash/assistant/assistant_ui_controller.cc
+++ b/ash/assistant/assistant_ui_controller.cc
@@ -207,9 +207,17 @@
   UpdateUiMode(AssistantUiMode::kWebUi);
 }
 
-void AssistantUiController::OnUrlOpened(const GURL& url) {
-  // We hide Assistant UI when opening a URL in a new tab.
-  if (model_.visibility() == AssistantVisibility::kVisible)
+void AssistantUiController::OnUrlOpened(const GURL& url, bool from_server) {
+  if (model_.visibility() != AssistantVisibility::kVisible)
+    return;
+
+  // We close the Assistant UI entirely when opening a new browser tab if the
+  // navigation was initiated by a server response. Otherwise the navigation
+  // was user initiated so we only hide the UI to retain session state. That way
+  // the user can choose to resume their session if they are so inclined.
+  if (from_server)
+    CloseUi(AssistantSource::kUnspecified);
+  else
     HideUi(AssistantSource::kUnspecified);
 }
 
diff --git a/ash/assistant/assistant_ui_controller.h b/ash/assistant/assistant_ui_controller.h
index 48b092a..6f98a8f 100644
--- a/ash/assistant/assistant_ui_controller.h
+++ b/ash/assistant/assistant_ui_controller.h
@@ -103,7 +103,7 @@
   void OnDeepLinkReceived(
       assistant::util::DeepLinkType type,
       const std::map<std::string, std::string>& params) override;
-  void OnUrlOpened(const GURL& url) override;
+  void OnUrlOpened(const GURL& url, bool from_server) override;
 
   // AssistantUiModelObserver:
   void OnUiVisibilityChanged(AssistantVisibility new_visibility,
diff --git a/ash/frame/non_client_frame_view_ash.cc b/ash/frame/non_client_frame_view_ash.cc
index fb1f2f57..1ae043d1 100644
--- a/ash/frame/non_client_frame_view_ash.cc
+++ b/ash/frame/non_client_frame_view_ash.cc
@@ -59,7 +59,8 @@
     Shell::Get()->tablet_mode_controller()->AddObserver(this);
 
     immersive_fullscreen_controller_ =
-        std::make_unique<ImmersiveFullscreenController>();
+        std::make_unique<ImmersiveFullscreenController>(
+            Shell::Get()->immersive_context());
     custom_frame_view->InitImmersiveFullscreenControllerForView(
         immersive_fullscreen_controller_.get());
   }
diff --git a/ash/frame/non_client_frame_view_ash_unittest.cc b/ash/frame/non_client_frame_view_ash_unittest.cc
index 8753d54f..a513ea3 100644
--- a/ash/frame/non_client_frame_view_ash_unittest.cc
+++ b/ash/frame/non_client_frame_view_ash_unittest.cc
@@ -725,7 +725,7 @@
   EXPECT_TRUE(wide_header_view->should_paint());
 
   // Test immersive.
-  ImmersiveFullscreenController controller;
+  ImmersiveFullscreenController controller(Shell::Get()->immersive_context());
   wide_frame_view->Init(&controller);
   EXPECT_FALSE(wide_header_view->in_immersive_mode());
   EXPECT_FALSE(header_view->in_immersive_mode());
diff --git a/ash/mojo_interface_factory.cc b/ash/mojo_interface_factory.cc
index a7314583..0713c075 100644
--- a/ash/mojo_interface_factory.cc
+++ b/ash/mojo_interface_factory.cc
@@ -22,7 +22,6 @@
 #include "ash/login/login_screen_controller.h"
 #include "ash/magnifier/docked_magnifier_controller.h"
 #include "ash/media_controller.h"
-#include "ash/message_center/message_center_controller.h"
 #include "ash/metrics/time_to_first_present_recorder.h"
 #include "ash/new_window_controller.h"
 #include "ash/note_taking_controller.h"
@@ -34,6 +33,7 @@
 #include "ash/shell_delegate.h"
 #include "ash/shutdown_controller.h"
 #include "ash/system/locale/locale_notification_controller.h"
+#include "ash/system/message_center/message_center_controller.h"
 #include "ash/system/model/system_tray_model.h"
 #include "ash/system/network/vpn_list.h"
 #include "ash/system/night_light/night_light_controller.h"
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index 726113e..98ed333 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -68,7 +68,6 @@
     "frame_utils.cc",
     "frame_utils.h",
     "gesture_action_type.h",
-    "immersive/immersive_context.cc",
     "immersive/immersive_context.h",
     "immersive/immersive_focus_watcher.h",
     "immersive/immersive_fullscreen_controller.cc",
diff --git a/ash/public/cpp/immersive/immersive_context.cc b/ash/public/cpp/immersive/immersive_context.cc
deleted file mode 100644
index f2e1737..0000000
--- a/ash/public/cpp/immersive/immersive_context.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 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/public/cpp/immersive/immersive_context.h"
-
-#include "base/logging.h"
-
-namespace ash {
-
-// static
-ImmersiveContext* ImmersiveContext::instance_ = nullptr;
-
-ImmersiveContext::ImmersiveContext() {
-  DCHECK(!instance_);
-  instance_ = this;
-}
-
-ImmersiveContext::~ImmersiveContext() {
-  DCHECK_EQ(instance_, this);
-  instance_ = nullptr;
-}
-
-}  // namespace ash
diff --git a/ash/public/cpp/immersive/immersive_context.h b/ash/public/cpp/immersive/immersive_context.h
index cfb666e7..7bb83b8 100644
--- a/ash/public/cpp/immersive/immersive_context.h
+++ b/ash/public/cpp/immersive/immersive_context.h
@@ -20,17 +20,13 @@
 
 class ImmersiveFullscreenController;
 
-// ImmersiveFullscreenController is used in four distinct environments: ash,
-// mash, chrome in ash and chrome in mash. All of these have slightly different
-// restrictions. ImmersiveContext enables ImmersiveFullscreenController to be
-// used in these different environments. ImmersiveContext abstracts away all the
-// windowing related calls so that ImmersiveFullscreenController does not
-// depend upon aura, mus or ash.
-//
-// ImmersiveContext is a singleton.
+// ImmersiveContext abstracts away all the windowing related calls so that
+// ImmersiveFullscreenController does not depend upon aura, mus or ash. In Ash,
+// the browser and Ash will share one implementation. In Mash, the client will
+// have its own.
 class ASH_PUBLIC_EXPORT ImmersiveContext {
  public:
-  static ImmersiveContext* Get() { return instance_; }
+  virtual ~ImmersiveContext() = default;
 
   // Used to setup state necessary for entering or existing immersive mode. It
   // is expected this interacts with the shelf, and installs any other necessary
@@ -52,13 +48,6 @@
 
   // See Shell::IsMouseEventsEnabled() for details.
   virtual bool IsMouseEventsEnabled() = 0;
-
- protected:
-  ImmersiveContext();
-  virtual ~ImmersiveContext();
-
- private:
-  static ImmersiveContext* instance_;
 };
 
 }  // namespace ash
diff --git a/ash/public/cpp/immersive/immersive_fullscreen_controller.cc b/ash/public/cpp/immersive/immersive_fullscreen_controller.cc
index e607840..88a6498 100644
--- a/ash/public/cpp/immersive/immersive_fullscreen_controller.cc
+++ b/ash/public/cpp/immersive/immersive_fullscreen_controller.cc
@@ -18,7 +18,6 @@
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/events/base_event_utils.h"
-#include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -87,19 +86,10 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-ImmersiveFullscreenController::ImmersiveFullscreenController()
-    : delegate_(NULL),
-      top_container_(NULL),
-      widget_(NULL),
-      event_observers_enabled_(false),
-      enabled_(false),
-      reveal_state_(CLOSED),
-      revealed_lock_count_(0),
-      mouse_x_when_hit_top_in_screen_(-1),
-      gesture_begun_(false),
-      animation_(new gfx::SlideAnimation(this)),
-      animations_disabled_for_test_(value_for_animations_disabled_for_test_),
-      weak_ptr_factory_(this) {}
+ImmersiveFullscreenController::ImmersiveFullscreenController(
+    ImmersiveContext* context)
+    : immersive_context_(context),
+      animations_disabled_for_test_(value_for_animations_disabled_for_test_) {}
 
 ImmersiveFullscreenController::~ImmersiveFullscreenController() {
   EnableEventObservers(false);
@@ -347,14 +337,14 @@
         ImmersiveHandlerFactory::Get()->CreateFocusWatcher(this);
     immersive_gesture_handler_ =
         ImmersiveHandlerFactory::Get()->CreateGestureHandler(this);
-    ImmersiveContext::Get()->AddPointerWatcher(
+    immersive_context_->AddPointerWatcher(
         this, views::PointerWatcherEventTypes::MOVES);
   } else {
-    ImmersiveContext::Get()->RemovePointerWatcher(this);
+    immersive_context_->RemovePointerWatcher(this);
     immersive_gesture_handler_.reset();
     immersive_focus_watcher_.reset();
 
-    animation_->Stop();
+    animation_.Stop();
   }
 }
 
@@ -374,7 +364,7 @@
 
   // Mouse hover should not initiate revealing the top-of-window views while a
   // window has mouse capture.
-  if (ImmersiveContext::Get()->DoesAnyWindowHaveCapture())
+  if (immersive_context_->DoesAnyWindowHaveCapture())
     return;
 
   if (ShouldIgnoreMouseEventAtLocation(location_in_screen))
@@ -431,7 +421,7 @@
 
   // Ignore all events while a window has capture. This keeps the top-of-window
   // views revealed during a drag.
-  if (ImmersiveContext::Get()->DoesAnyWindowHaveCapture())
+  if (immersive_context_->DoesAnyWindowHaveCapture())
     return;
 
   if ((!event || event->IsMouseEvent()) &&
@@ -467,7 +457,7 @@
 }
 
 void ImmersiveFullscreenController::UpdateLocatedEventRevealedLock() {
-  if (!ImmersiveContext::Get()->IsMouseEventsEnabled()) {
+  if (!immersive_context_->IsMouseEventsEnabled()) {
     // If mouse events are disabled, the user's last interaction was probably
     // via touch. Do no do further processing in this case as there is no easy
     // way of retrieving the position of the user's last touch.
@@ -562,11 +552,11 @@
   }
   // Slide in the reveal view.
   if (animate == ANIMATE_NO) {
-    animation_->Reset(1);
+    animation_.Reset(1);
     OnSlideOpenAnimationCompleted();
   } else {
-    animation_->SetSlideDuration(GetAnimationDuration(animate));
-    animation_->Show();
+    animation_.SetSlideDuration(GetAnimationDuration(animate));
+    animation_.Show();
   }
 }
 
@@ -597,10 +587,10 @@
   reveal_state_ = SLIDING_CLOSED;
   int duration_ms = GetAnimationDuration(animate);
   if (duration_ms > 0) {
-    animation_->SetSlideDuration(duration_ms);
-    animation_->Hide();
+    animation_.SetSlideDuration(duration_ms);
+    animation_.Hide();
   } else {
-    animation_->Reset(0);
+    animation_.Reset(0);
     OnSlideClosedAnimationCompleted();
   }
 }
@@ -683,7 +673,7 @@
 }
 
 gfx::Rect ImmersiveFullscreenController::GetDisplayBoundsInScreen() const {
-  return ImmersiveContext::Get()->GetDisplayBoundsInScreen(widget_);
+  return immersive_context_->GetDisplayBoundsInScreen(widget_);
 }
 
 bool ImmersiveFullscreenController::IsTargetForWidget(
@@ -704,7 +694,7 @@
 
   EnableEventObservers(enabled_);
 
-  ImmersiveContext::Get()->OnEnteringOrExitingImmersive(this, enabled);
+  immersive_context_->OnEnteringOrExitingImmersive(this, enabled);
 
   if (enabled_) {
     // Animate enabling immersive mode by sliding out the top-of-window views.
diff --git a/ash/public/cpp/immersive/immersive_fullscreen_controller.h b/ash/public/cpp/immersive/immersive_fullscreen_controller.h
index f692fe3..8ea8f835 100644
--- a/ash/public/cpp/immersive/immersive_fullscreen_controller.h
+++ b/ash/public/cpp/immersive/immersive_fullscreen_controller.h
@@ -14,6 +14,7 @@
 #include "base/timer/timer.h"
 #include "ui/aura/window_observer.h"
 #include "ui/gfx/animation/animation_delegate.h"
+#include "ui/gfx/animation/slide_animation.h"
 #include "ui/views/pointer_watcher.h"
 #include "ui/views/view_observer.h"
 #include "ui/views/widget/widget_observer.h"
@@ -24,7 +25,6 @@
 
 namespace gfx {
 class Point;
-class SlideAnimation;
 }  // namespace gfx
 
 namespace ui {
@@ -41,6 +41,7 @@
 
 namespace ash {
 
+class ImmersiveContext;
 class ImmersiveFocusWatcher;
 class ImmersiveFullscreenControllerDelegate;
 class ImmersiveFullscreenControllerTestApi;
@@ -74,7 +75,7 @@
   // (primary display above/below secondary display).
   static const int kMouseRevealBoundsHeight;
 
-  ImmersiveFullscreenController();
+  explicit ImmersiveFullscreenController(ImmersiveContext* context);
   ~ImmersiveFullscreenController() override;
 
   // Initializes the controller. Must be called prior to enabling immersive
@@ -250,31 +251,32 @@
   void EnableTouchInsets(bool enable);
 
   // Not owned.
-  ImmersiveFullscreenControllerDelegate* delegate_;
-  views::View* top_container_;
-  views::Widget* widget_;
+  ImmersiveContext* immersive_context_;
+  ImmersiveFullscreenControllerDelegate* delegate_ = nullptr;
+  views::View* top_container_ = nullptr;
+  views::Widget* widget_ = nullptr;
 
   // True if the observers have been enabled.
-  bool event_observers_enabled_;
+  bool event_observers_enabled_ = false;
 
   // True when in immersive fullscreen.
-  bool enabled_;
+  bool enabled_ = false;
 
   // State machine for the revealed/closed animations.
-  RevealState reveal_state_;
+  RevealState reveal_state_ = CLOSED;
 
-  int revealed_lock_count_;
+  int revealed_lock_count_ = 0;
 
   // Timer to track cursor being held at the top edge of the screen.
   base::OneShotTimer top_edge_hover_timer_;
 
   // The cursor x position in screen coordinates when the cursor first hit the
   // top edge of the screen.
-  int mouse_x_when_hit_top_in_screen_;
+  int mouse_x_when_hit_top_in_screen_ = -1;
 
   // Tracks if the controller has seen a ET_GESTURE_SCROLL_BEGIN, without the
   // following events.
-  bool gesture_begun_;
+  bool gesture_begun_ = false;
 
   // Lock which keeps the top-of-window views revealed based on the current
   // mouse state and the current touch state. Acquiring the lock is used to
@@ -283,7 +285,7 @@
   std::unique_ptr<ImmersiveRevealedLock> located_event_revealed_lock_;
 
   // The animation which controls sliding the top-of-window views in and out.
-  std::unique_ptr<gfx::SlideAnimation> animation_;
+  gfx::SlideAnimation animation_{this};
 
   // Whether the animations are disabled for testing.
   bool animations_disabled_for_test_;
@@ -300,7 +302,7 @@
   // ImmersiveFullscreenControllerTestApi::GlobalAnimationDisabler for details.
   static bool value_for_animations_disabled_for_test_;
 
-  base::WeakPtrFactory<ImmersiveFullscreenController> weak_ptr_factory_;
+  base::WeakPtrFactory<ImmersiveFullscreenController> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ImmersiveFullscreenController);
 };
diff --git a/ash/shell.cc b/ash/shell.cc
index 00055a88..1a37cf5 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -63,7 +63,6 @@
 #include "ash/magnifier/magnification_controller.h"
 #include "ash/magnifier/partial_magnification_controller.h"
 #include "ash/media_controller.h"
-#include "ash/message_center/message_center_controller.h"
 #include "ash/metrics/time_to_first_present_recorder.h"
 #include "ash/multi_device_setup/multi_device_notification_presenter.h"
 #include "ash/new_window_controller.h"
@@ -98,6 +97,7 @@
 #include "ash/system/keyboard_brightness/keyboard_brightness_controller.h"
 #include "ash/system/keyboard_brightness_control_delegate.h"
 #include "ash/system/locale/locale_notification_controller.h"
+#include "ash/system/message_center/message_center_controller.h"
 #include "ash/system/model/system_tray_model.h"
 #include "ash/system/network/sms_observer.h"
 #include "ash/system/network/vpn_list.h"
diff --git a/ash/shell.h b/ash/shell.h
index 0d7742d..a132b2f 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -130,7 +130,7 @@
 class HighlighterController;
 class ImeController;
 class ImeFocusHandler;
-class ImmersiveContextAsh;
+class ImmersiveContext;
 class ImmersiveHandlerFactoryAsh;
 class KeyAccessibilityEnabler;
 class KeyboardBrightnessControlDelegate;
@@ -414,6 +414,7 @@
     return high_contrast_controller_.get();
   }
   ImeController* ime_controller() { return ime_controller_.get(); }
+  ImmersiveContext* immersive_context() { return immersive_context_.get(); }
   KeyAccessibilityEnabler* key_accessibility_enabler() {
     return key_accessibility_enabler_.get();
   }
@@ -750,7 +751,7 @@
   std::unique_ptr<FocusCycler> focus_cycler_;
   std::unique_ptr<ImeController> ime_controller_;
   std::unique_ptr<ImeFocusHandler> ime_focus_handler_;
-  std::unique_ptr<ImmersiveContextAsh> immersive_context_;
+  std::unique_ptr<ImmersiveContext> immersive_context_;
   std::unique_ptr<KeyboardBrightnessControlDelegate>
       keyboard_brightness_control_delegate_;
   std::unique_ptr<keyboard::KeyboardController> keyboard_controller_;
diff --git a/ash/message_center/OWNERS b/ash/system/message_center/OWNERS
similarity index 100%
rename from ash/message_center/OWNERS
rename to ash/system/message_center/OWNERS
diff --git a/ash/system/message_center/arc/arc_notification_content_view_unittest.cc b/ash/system/message_center/arc/arc_notification_content_view_unittest.cc
index 2ef698c..47d0ef9 100644
--- a/ash/system/message_center/arc/arc_notification_content_view_unittest.cc
+++ b/ash/system/message_center/arc/arc_notification_content_view_unittest.cc
@@ -8,7 +8,6 @@
 #include <string>
 #include <utility>
 
-#include "ash/message_center/message_center_view.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/shell.h"
 #include "ash/system/message_center/arc/arc_notification_content_view.h"
@@ -19,6 +18,7 @@
 #include "ash/system/message_center/arc/arc_notification_surface_manager_impl.h"
 #include "ash/system/message_center/arc/arc_notification_view.h"
 #include "ash/system/message_center/arc/mock_arc_notification_item.h"
+#include "ash/system/message_center/message_center_view.h"
 #include "ash/system/message_center/notification_tray.h"
 #include "ash/system/status_area_widget.h"
 #include "ash/system/status_area_widget_test_helper.h"
diff --git a/ash/message_center/arc_notification_manager_delegate_impl.cc b/ash/system/message_center/arc_notification_manager_delegate_impl.cc
similarity index 93%
rename from ash/message_center/arc_notification_manager_delegate_impl.cc
rename to ash/system/message_center/arc_notification_manager_delegate_impl.cc
index fefe5ae..f4bc85c 100644
--- a/ash/message_center/arc_notification_manager_delegate_impl.cc
+++ b/ash/system/message_center/arc_notification_manager_delegate_impl.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/message_center/arc_notification_manager_delegate_impl.h"
+#include "ash/system/message_center/arc_notification_manager_delegate_impl.h"
 
 #include "ash/login_status.h"
-#include "ash/message_center/message_center_controller.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
+#include "ash/system/message_center/message_center_controller.h"
 #include "ash/system/message_center/notification_tray.h"
 #include "ash/system/status_area_widget.h"
 #include "ash/system/unified/unified_system_tray.h"
diff --git a/ash/message_center/arc_notification_manager_delegate_impl.h b/ash/system/message_center/arc_notification_manager_delegate_impl.h
similarity index 78%
rename from ash/message_center/arc_notification_manager_delegate_impl.h
rename to ash/system/message_center/arc_notification_manager_delegate_impl.h
index 088f71e6..e3e45de 100644
--- a/ash/message_center/arc_notification_manager_delegate_impl.h
+++ b/ash/system/message_center/arc_notification_manager_delegate_impl.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_MESSAGE_CENTER_ARC_NOTIFICATION_MANAGER_DELEGATE_IMPL_H_
-#define ASH_MESSAGE_CENTER_ARC_NOTIFICATION_MANAGER_DELEGATE_IMPL_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_ARC_NOTIFICATION_MANAGER_DELEGATE_IMPL_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_ARC_NOTIFICATION_MANAGER_DELEGATE_IMPL_H_
 
 #include "ash/system/message_center/arc/arc_notification_manager_delegate.h"
 #include "base/macros.h"
@@ -29,4 +29,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_ARC_NOTIFICATION_MANAGER_DELEGATE_IMPL_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_ARC_NOTIFICATION_MANAGER_DELEGATE_IMPL_H_
diff --git a/ash/message_center/ash_message_center_lock_screen_controller.cc b/ash/system/message_center/ash_message_center_lock_screen_controller.cc
similarity index 98%
rename from ash/message_center/ash_message_center_lock_screen_controller.cc
rename to ash/system/message_center/ash_message_center_lock_screen_controller.cc
index 8df9bc6..9f83341 100644
--- a/ash/message_center/ash_message_center_lock_screen_controller.cc
+++ b/ash/system/message_center/ash_message_center_lock_screen_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/message_center/ash_message_center_lock_screen_controller.h"
+#include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
 
 #include "ash/login/ui/lock_screen.h"
 #include "ash/login/ui/lock_window.h"
diff --git a/ash/message_center/ash_message_center_lock_screen_controller.h b/ash/system/message_center/ash_message_center_lock_screen_controller.h
similarity index 87%
rename from ash/message_center/ash_message_center_lock_screen_controller.h
rename to ash/system/message_center/ash_message_center_lock_screen_controller.h
index 46ac0c8..1c33856 100644
--- a/ash/message_center/ash_message_center_lock_screen_controller.h
+++ b/ash/system/message_center/ash_message_center_lock_screen_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_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
-#define ASH_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
 
 #include "ash/ash_export.h"
 #include "ash/session/session_observer.h"
@@ -55,4 +55,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
diff --git a/ash/system/message_center/inactive_user_notification_blocker_unittest.cc b/ash/system/message_center/inactive_user_notification_blocker_unittest.cc
index 8e802051..53d49e03 100644
--- a/ash/system/message_center/inactive_user_notification_blocker_unittest.cc
+++ b/ash/system/message_center/inactive_user_notification_blocker_unittest.cc
@@ -4,10 +4,10 @@
 
 #include "ash/system/message_center/inactive_user_notification_blocker.h"
 
-#include "ash/message_center/message_center_controller.h"
 #include "ash/session/test_session_controller_client.h"
 #include "ash/shell.h"
 #include "ash/shell_test_api.h"
+#include "ash/system/message_center/message_center_controller.h"
 #include "ash/test/ash_test_base.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/ash/message_center/message_center_bubble.cc b/ash/system/message_center/message_center_bubble.cc
similarity index 97%
rename from ash/message_center/message_center_bubble.cc
rename to ash/system/message_center/message_center_bubble.cc
index 6dce1a3..06d11732 100644
--- a/ash/message_center/message_center_bubble.cc
+++ b/ash/system/message_center/message_center_bubble.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/message_center/message_center_bubble.h"
+#include "ash/system/message_center/message_center_bubble.h"
 
-#include "ash/message_center/message_center_view.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
+#include "ash/system/message_center/message_center_view.h"
 #include "ash/system/tray/tray_bubble_view.h"
 #include "base/macros.h"
 #include "ui/message_center/message_center.h"
diff --git a/ash/message_center/message_center_bubble.h b/ash/system/message_center/message_center_bubble.h
similarity index 91%
rename from ash/message_center/message_center_bubble.h
rename to ash/system/message_center/message_center_bubble.h
index 124af32f..e9a900d 100644
--- a/ash/message_center/message_center_bubble.h
+++ b/ash/system/message_center/message_center_bubble.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_MESSAGE_CENTER_MESSAGE_CENTER_BUBBLE_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_BUBBLE_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_BUBBLE_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_BUBBLE_H_
 
 #include <stddef.h>
 
@@ -71,4 +71,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_BUBBLE_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_BUBBLE_H_
diff --git a/ash/message_center/message_center_button_bar.cc b/ash/system/message_center/message_center_button_bar.cc
similarity index 97%
rename from ash/message_center/message_center_button_bar.cc
rename to ash/system/message_center/message_center_button_bar.cc
index ea3eb570..231cf7e 100644
--- a/ash/message_center/message_center_button_bar.cc
+++ b/ash/system/message_center/message_center_button_bar.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/message_center/message_center_button_bar.h"
+#include "ash/system/message_center/message_center_button_bar.h"
 
-#include "ash/message_center/ash_message_center_lock_screen_controller.h"
-#include "ash/message_center/message_center_style.h"
-#include "ash/message_center/message_center_view.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
+#include "ash/system/message_center/message_center_style.h"
+#include "ash/system/message_center/message_center_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_popup_utils.h"
 #include "base/macros.h"
diff --git a/ash/message_center/message_center_button_bar.h b/ash/system/message_center/message_center_button_bar.h
similarity index 94%
rename from ash/message_center/message_center_button_bar.h
rename to ash/system/message_center/message_center_button_bar.h
index 800cae8..a880903 100644
--- a/ash/message_center/message_center_button_bar.h
+++ b/ash/system/message_center/message_center_button_bar.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_MESSAGE_CENTER_MESSAGE_CENTER_BUTTON_BAR_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_BUTTON_BAR_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_BUTTON_BAR_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_BUTTON_BAR_H_
 
 #include "ash/ash_export.h"
 #include "base/macros.h"
@@ -107,4 +107,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_BUTTON_BAR_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_BUTTON_BAR_H_
diff --git a/ash/message_center/message_center_controller.cc b/ash/system/message_center/message_center_controller.cc
similarity index 97%
rename from ash/message_center/message_center_controller.cc
rename to ash/system/message_center/message_center_controller.cc
index 708b8d7..3560ea2 100644
--- a/ash/message_center/message_center_controller.cc
+++ b/ash/system/message_center/message_center_controller.cc
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/message_center/message_center_controller.h"
+#include "ash/system/message_center/message_center_controller.h"
 
 #include <utility>
 
-#include "ash/message_center/arc_notification_manager_delegate_impl.h"
-#include "ash/message_center/ash_message_center_lock_screen_controller.h"
 #include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/system/message_center/arc_notification_manager_delegate_impl.h"
+#include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/unguessable_token.h"
diff --git a/ash/message_center/message_center_controller.h b/ash/system/message_center/message_center_controller.h
similarity index 95%
rename from ash/message_center/message_center_controller.h
rename to ash/system/message_center/message_center_controller.h
index ac14902..258894b 100644
--- a/ash/message_center/message_center_controller.h
+++ b/ash/system/message_center/message_center_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_MESSAGE_CENTER_MESSAGE_CENTER_CONTROLLER_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_CONTROLLER_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_CONTROLLER_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_CONTROLLER_H_
 
 #include <memory>
 #include <string>
@@ -122,4 +122,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_CONTROLLER_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_CONTROLLER_H_
diff --git a/ash/message_center/message_center_scroll_bar.cc b/ash/system/message_center/message_center_scroll_bar.cc
similarity index 96%
rename from ash/message_center/message_center_scroll_bar.cc
rename to ash/system/message_center/message_center_scroll_bar.cc
index 0f8db77..5c2d649 100644
--- a/ash/message_center/message_center_scroll_bar.cc
+++ b/ash/system/message_center/message_center_scroll_bar.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/message_center/message_center_scroll_bar.h"
+#include "ash/system/message_center/message_center_scroll_bar.h"
 
 #include "ash/public/cpp/ash_features.h"
 #include "base/metrics/histogram_macros.h"
diff --git a/ash/message_center/message_center_scroll_bar.h b/ash/system/message_center/message_center_scroll_bar.h
similarity index 87%
rename from ash/message_center/message_center_scroll_bar.h
rename to ash/system/message_center/message_center_scroll_bar.h
index 36627e7..eac1646 100644
--- a/ash/message_center/message_center_scroll_bar.h
+++ b/ash/system/message_center/message_center_scroll_bar.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_MESSAGE_CENTER_MESSAGE_CENTER_SCROLL_BAR_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_SCROLL_BAR_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_SCROLL_BAR_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_SCROLL_BAR_H_
 
 #include "ui/events/event.h"
 #include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
@@ -46,4 +46,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_SCROLL_BAR_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_SCROLL_BAR_H_
diff --git a/ash/message_center/message_center_style.h b/ash/system/message_center/message_center_style.h
similarity index 82%
rename from ash/message_center/message_center_style.h
rename to ash/system/message_center/message_center_style.h
index 63e03885..2c03c846 100644
--- a/ash/message_center/message_center_style.h
+++ b/ash/system/message_center/message_center_style.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_MESSAGE_CENTER_MESSAGE_CENTER_STYLE_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_STYLE_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_STYLE_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_STYLE_H_
 
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/font_list.h"
@@ -30,4 +30,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_STYLE_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_STYLE_H_
diff --git a/ash/message_center/message_center_ui_controller.cc b/ash/system/message_center/message_center_ui_controller.cc
similarity index 98%
rename from ash/message_center/message_center_ui_controller.cc
rename to ash/system/message_center/message_center_ui_controller.cc
index 1edba8e..c731e6ed 100644
--- a/ash/message_center/message_center_ui_controller.cc
+++ b/ash/system/message_center/message_center_ui_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/message_center/message_center_ui_controller.h"
+#include "ash/system/message_center/message_center_ui_controller.h"
 
 #include <memory>
 
diff --git a/ash/message_center/message_center_ui_controller.h b/ash/system/message_center/message_center_ui_controller.h
similarity index 92%
rename from ash/message_center/message_center_ui_controller.h
rename to ash/system/message_center/message_center_ui_controller.h
index fa31db9..3992b9c 100644
--- a/ash/message_center/message_center_ui_controller.h
+++ b/ash/system/message_center/message_center_ui_controller.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_MESSAGE_CENTER_MESSAGE_CENTER_UI_CONTROLLER_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_UI_CONTROLLER_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UI_CONTROLLER_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UI_CONTROLLER_H_
 
 #include "ash/ash_export.h"
-#include "ash/message_center/message_center_ui_delegate.h"
+#include "ash/system/message_center/message_center_ui_delegate.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/strings/string16.h"
@@ -95,4 +95,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_UI_CONTROLLER_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UI_CONTROLLER_H_
diff --git a/ash/message_center/message_center_ui_controller_unittest.cc b/ash/system/message_center/message_center_ui_controller_unittest.cc
similarity index 98%
rename from ash/message_center/message_center_ui_controller_unittest.cc
rename to ash/system/message_center/message_center_ui_controller_unittest.cc
index a179b22e..e32b034 100644
--- a/ash/message_center/message_center_ui_controller_unittest.cc
+++ b/ash/system/message_center/message_center_ui_controller_unittest.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/message_center/message_center_ui_controller.h"
+#include "ash/system/message_center/message_center_ui_controller.h"
 
 #include <utility>
 
diff --git a/ash/message_center/message_center_ui_delegate.h b/ash/system/message_center/message_center_ui_delegate.h
similarity index 86%
rename from ash/message_center/message_center_ui_delegate.h
rename to ash/system/message_center/message_center_ui_delegate.h
index 4aae7ff..4fb6fe3 100644
--- a/ash/message_center/message_center_ui_delegate.h
+++ b/ash/system/message_center/message_center_ui_delegate.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_MESSAGE_CENTER_MESSAGE_CENTER_UI_DELEGATE_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_UI_DELEGATE_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UI_DELEGATE_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UI_DELEGATE_H_
 
 namespace ash {
 
@@ -36,4 +36,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_UI_DELEGATE_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_UI_DELEGATE_H_
diff --git a/ash/message_center/message_center_view.cc b/ash/system/message_center/message_center_view.cc
similarity index 98%
rename from ash/message_center/message_center_view.cc
rename to ash/system/message_center/message_center_view.cc
index 7db7e1c..b2d9e4e 100644
--- a/ash/message_center/message_center_view.cc
+++ b/ash/system/message_center/message_center_view.cc
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/message_center/message_center_view.h"
+#include "ash/system/message_center/message_center_view.h"
 
 #include <list>
 #include <map>
 
-#include "ash/message_center/ash_message_center_lock_screen_controller.h"
-#include "ash/message_center/message_center_button_bar.h"
-#include "ash/message_center/message_center_scroll_bar.h"
-#include "ash/message_center/message_center_style.h"
-#include "ash/message_center/notifier_settings_view.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
+#include "ash/system/message_center/message_center_button_bar.h"
+#include "ash/system/message_center/message_center_scroll_bar.h"
+#include "ash/system/message_center/message_center_style.h"
+#include "ash/system/message_center/notifier_settings_view.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/stl_util.h"
diff --git a/ash/message_center/message_center_view.h b/ash/system/message_center/message_center_view.h
similarity index 96%
rename from ash/message_center/message_center_view.h
rename to ash/system/message_center/message_center_view.h
index 0285b9d..bf98af0b 100644
--- a/ash/message_center/message_center_view.h
+++ b/ash/system/message_center/message_center_view.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_MESSAGE_CENTER_MESSAGE_CENTER_VIEW_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_CENTER_VIEW_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_VIEW_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_VIEW_H_
 
 #include <stddef.h>
 
 #include "ash/ash_export.h"
-#include "ash/message_center/message_list_view.h"
 #include "ash/session/session_observer.h"
+#include "ash/system/message_center/message_list_view.h"
 #include "base/macros.h"
 #include "ui/gfx/animation/animation_delegate.h"
 #include "ui/message_center/message_center_observer.h"
@@ -181,4 +181,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_CENTER_VIEW_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_VIEW_H_
diff --git a/ash/message_center/message_center_view_unittest.cc b/ash/system/message_center/message_center_view_unittest.cc
similarity index 98%
rename from ash/message_center/message_center_view_unittest.cc
rename to ash/system/message_center/message_center_view_unittest.cc
index 3f66b94..c7aa38f 100644
--- a/ash/message_center/message_center_view_unittest.cc
+++ b/ash/system/message_center/message_center_view_unittest.cc
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/message_center/message_center_view.h"
+#include "ash/system/message_center/message_center_view.h"
 
 #include <map>
 #include <memory>
 #include <utility>
 
-#include "ash/message_center/ash_message_center_lock_screen_controller.h"
-#include "ash/message_center/message_center_button_bar.h"
-#include "ash/message_center/message_center_style.h"
-#include "ash/message_center/message_list_view.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_pref_names.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
+#include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
+#include "ash/system/message_center/message_center_button_bar.h"
+#include "ash/system/message_center/message_center_style.h"
+#include "ash/system/message_center/message_list_view.h"
 #include "ash/test/ash_test_base.h"
 #include "base/logging.h"
 #include "base/macros.h"
diff --git a/ash/message_center/message_list_view.cc b/ash/system/message_center/message_list_view.cc
similarity index 98%
rename from ash/message_center/message_list_view.cc
rename to ash/system/message_center/message_list_view.cc
index be732c99..698c202 100644
--- a/ash/message_center/message_list_view.cc
+++ b/ash/system/message_center/message_list_view.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/message_center/message_list_view.h"
+#include "ash/system/message_center/message_list_view.h"
 
-#include "ash/message_center/message_center_style.h"
-#include "ash/message_center/message_center_view.h"
-#include "ash/message_center/slidable_message_view.h"
+#include "ash/system/message_center/message_center_style.h"
+#include "ash/system/message_center/message_center_view.h"
+#include "ash/system/message_center/slidable_message_view.h"
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
diff --git a/ash/message_center/message_list_view.h b/ash/system/message_center/message_list_view.h
similarity index 96%
rename from ash/message_center/message_list_view.h
rename to ash/system/message_center/message_list_view.h
index 99c2914..1965e2e 100644
--- a/ash/message_center/message_list_view.h
+++ b/ash/system/message_center/message_list_view.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_MESSAGE_CENTER_MESSAGE_LIST_VIEW_H_
-#define ASH_MESSAGE_CENTER_MESSAGE_LIST_VIEW_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_LIST_VIEW_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_LIST_VIEW_H_
 
 #include <list>
 #include <set>
 #include <vector>
 
 #include "ash/ash_export.h"
-#include "ash/message_center/slidable_message_view.h"
+#include "ash/system/message_center/slidable_message_view.h"
 #include "base/macros.h"
 #include "ui/compositor/paint_context.h"
 #include "ui/gfx/geometry/rect.h"
@@ -166,4 +166,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_MESSAGE_LIST_VIEW_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_LIST_VIEW_H_
diff --git a/ash/message_center/message_list_view_unittest.cc b/ash/system/message_center/message_list_view_unittest.cc
similarity index 99%
rename from ash/message_center/message_list_view_unittest.cc
rename to ash/system/message_center/message_list_view_unittest.cc
index 91803ff..99100a5 100644
--- a/ash/message_center/message_list_view_unittest.cc
+++ b/ash/system/message_center/message_list_view_unittest.cc
@@ -6,8 +6,8 @@
 #include <memory>
 #include <utility>
 
-#include "ash/message_center/message_list_view.h"
-#include "ash/message_center/slidable_message_view.h"
+#include "ash/system/message_center/message_list_view.h"
+#include "ash/system/message_center/slidable_message_view.h"
 #include "ash/test/ash_test_base.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
diff --git a/ash/system/message_center/new_unified_message_center_view.cc b/ash/system/message_center/new_unified_message_center_view.cc
index 4251304..bb99c34 100644
--- a/ash/system/message_center/new_unified_message_center_view.cc
+++ b/ash/system/message_center/new_unified_message_center_view.cc
@@ -4,10 +4,10 @@
 
 #include "ash/system/message_center/new_unified_message_center_view.h"
 
-#include "ash/message_center/message_center_scroll_bar.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/system/message_center/message_center_scroll_bar.h"
 #include "ash/system/message_center/unified_message_list_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/sign_out_button.h"
@@ -23,16 +23,62 @@
 
 namespace ash {
 
+namespace {
+
+constexpr int kClearAllButtonRowHeight = 3 * kUnifiedNotificationCenterSpacing;
+
+class ScrollerContentsView : public views::View {
+ public:
+  ScrollerContentsView(UnifiedMessageListView* message_list_view,
+                       views::ButtonListener* listener) {
+    auto* contents_layout = SetLayoutManager(
+        std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
+    contents_layout->set_cross_axis_alignment(
+        views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH);
+    AddChildView(message_list_view);
+
+    views::View* button_container = new views::View;
+    auto* button_layout =
+        button_container->SetLayoutManager(std::make_unique<views::BoxLayout>(
+            views::BoxLayout::kHorizontal,
+            gfx::Insets(kUnifiedNotificationCenterSpacing), 0));
+    button_layout->set_main_axis_alignment(
+        views::BoxLayout::MAIN_AXIS_ALIGNMENT_END);
+
+    auto* clear_all_button = new RoundedLabelButton(
+        listener, l10n_util::GetStringUTF16(
+                      IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_LABEL));
+    clear_all_button->SetTooltipText(l10n_util::GetStringUTF16(
+        IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_TOOLTIP));
+    button_container->AddChildView(clear_all_button);
+    AddChildView(button_container);
+  }
+
+  ~ScrollerContentsView() override = default;
+
+  // views::View:
+  void ChildPreferredSizeChanged(views::View* view) override {
+    PreferredSizeChanged();
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ScrollerContentsView);
+};
+
+}  // namespace
+
 NewUnifiedMessageCenterView::NewUnifiedMessageCenterView()
-    : scroller_(new views::ScrollView()),
-      message_list_view_(new UnifiedMessageListView(this)) {
+    : scroll_bar_(new MessageCenterScrollBar(this)),
+      scroller_(new views::ScrollView()),
+      message_list_view_(new UnifiedMessageListView(this)),
+      position_from_bottom_(kClearAllButtonRowHeight) {
   message_list_view_->Init();
 
   // Need to set the transparent background explicitly, since ScrollView has
   // set the default opaque background color.
-  scroller_->SetContents(CreateScrollerContents());
+  scroller_->SetContents(new ScrollerContentsView(message_list_view_, this));
   scroller_->SetBackgroundColor(SK_ColorTRANSPARENT);
-  scroller_->SetVerticalScrollBar(new MessageCenterScrollBar(this));
+  scroller_->SetVerticalScrollBar(scroll_bar_);
   scroller_->set_draw_overflow_indicator(false);
   AddChildView(scroller_);
 
@@ -48,6 +94,7 @@
 void NewUnifiedMessageCenterView::ListPreferredSizeChanged() {
   UpdateVisibility();
   PreferredSizeChanged();
+  ScrollToPositionFromBottom();
 
   if (GetWidget())
     GetWidget()->SynthesizeMouseMoveEvent();
@@ -62,17 +109,30 @@
   // We have to manually layout because we want to override
   // CalculatePreferredSize().
   scroller_->SetBoundsRect(GetContentsBounds());
+
+  // If the last notification is taller than |scroller_|, we should align the
+  // top of the notification with the top of |scroller_|.
+  const int last_notification_offset =
+      message_list_view_->GetLastNotificationHeight() - scroller_->height() +
+      kUnifiedNotificationCenterSpacing;
+  if (position_from_bottom_ == kClearAllButtonRowHeight &&
+      last_notification_offset > 0) {
+    position_from_bottom_ += last_notification_offset;
+  }
+  ScrollToPositionFromBottom();
 }
 
 gfx::Size NewUnifiedMessageCenterView::CalculatePreferredSize() const {
   gfx::Size preferred_size = scroller_->GetPreferredSize();
   // Hide Clear All button at the buttom from initial viewport.
-  preferred_size.set_height(preferred_size.height() -
-                            3 * kUnifiedNotificationCenterSpacing);
+  preferred_size.set_height(preferred_size.height() - kClearAllButtonRowHeight);
   return preferred_size;
 }
 
-void NewUnifiedMessageCenterView::OnMessageCenterScrolled() {}
+void NewUnifiedMessageCenterView::OnMessageCenterScrolled() {
+  position_from_bottom_ =
+      scroll_bar_->GetMaxPosition() - scroller_->GetVisibleRect().y();
+}
 
 void NewUnifiedMessageCenterView::ButtonPressed(views::Button* sender,
                                                 const ui::Event& event) {
@@ -89,32 +149,16 @@
   SetVisible(message_list_view_->child_count() > 0 &&
              session_controller->ShouldShowNotificationTray() &&
              !session_controller->IsScreenLocked());
+  // When notification list went invisible, |position_from_bottom_| should be
+  // reset.
+  if (!visible())
+    position_from_bottom_ = kClearAllButtonRowHeight;
 }
 
-views::View* NewUnifiedMessageCenterView::CreateScrollerContents() {
-  views::View* scroller_contents = new views::View;
-  auto* contents_layout = scroller_contents->SetLayoutManager(
-      std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
-  contents_layout->set_cross_axis_alignment(
-      views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH);
-  scroller_contents->AddChildView(message_list_view_);
-
-  views::View* button_container = new views::View;
-  auto* button_layout =
-      button_container->SetLayoutManager(std::make_unique<views::BoxLayout>(
-          views::BoxLayout::kHorizontal,
-          gfx::Insets(kUnifiedNotificationCenterSpacing), 0));
-  button_layout->set_main_axis_alignment(
-      views::BoxLayout::MAIN_AXIS_ALIGNMENT_END);
-
-  auto* clear_all_button = new RoundedLabelButton(
-      this,
-      l10n_util::GetStringUTF16(IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_LABEL));
-  clear_all_button->SetTooltipText(l10n_util::GetStringUTF16(
-      IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_TOOLTIP));
-  button_container->AddChildView(clear_all_button);
-  scroller_contents->AddChildView(button_container);
-  return scroller_contents;
+void NewUnifiedMessageCenterView::ScrollToPositionFromBottom() {
+  scroller_->ScrollToPosition(
+      scroll_bar_,
+      std::max(0, scroll_bar_->GetMaxPosition() - position_from_bottom_));
 }
 
 }  // namespace ash
diff --git a/ash/system/message_center/new_unified_message_center_view.h b/ash/system/message_center/new_unified_message_center_view.h
index 58065c51..871722c2a 100644
--- a/ash/system/message_center/new_unified_message_center_view.h
+++ b/ash/system/message_center/new_unified_message_center_view.h
@@ -6,20 +6,20 @@
 #define ASH_SYSTEM_MESSAGE_CENTER_NEW_UNIFIED_MESSAGE_CENTER_VIEW_H_
 
 #include "ash/ash_export.h"
-#include "ash/message_center/message_center_scroll_bar.h"
+#include "ash/system/message_center/message_center_scroll_bar.h"
 #include "ash/system/message_center/unified_message_list_view.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/focus/focus_manager.h"
 #include "ui/views/view.h"
 
 namespace views {
-
 class ScrollView;
-
 }  // namespace views
 
 namespace ash {
 
+class MessageCenterScrollBar;
+
 // Manages scrolling of notification list.
 // TODO(tetsui): Rename to UnifiedMessageCenterView after old code is removed.
 class ASH_EXPORT NewUnifiedMessageCenterView
@@ -54,11 +54,17 @@
   friend class NewUnifiedMessageCenterViewTest;
 
   void UpdateVisibility();
-  views::View* CreateScrollerContents();
 
+  // Scroll the notification list to |position_from_bottom_|.
+  void ScrollToPositionFromBottom();
+
+  MessageCenterScrollBar* const scroll_bar_;
   views::ScrollView* const scroller_;
   UnifiedMessageListView* const message_list_view_;
 
+  // Position from the bottom of scroll contents in dip.
+  int position_from_bottom_;
+
   DISALLOW_COPY_AND_ASSIGN(NewUnifiedMessageCenterView);
 };
 
diff --git a/ash/system/message_center/new_unified_message_center_view_unittest.cc b/ash/system/message_center/new_unified_message_center_view_unittest.cc
index d37b1ea..e7b54630 100644
--- a/ash/system/message_center/new_unified_message_center_view_unittest.cc
+++ b/ash/system/message_center/new_unified_message_center_view_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "ash/system/message_center/new_unified_message_center_view.h"
 
+#include "ash/system/message_center/message_center_scroll_bar.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/unified_system_tray_controller.h"
 #include "ash/test/ash_test_base.h"
@@ -22,6 +23,8 @@
 
 namespace {
 
+constexpr int kDefaultMaxHeight = 500;
+
 class DummyEvent : public ui::Event {
  public:
   DummyEvent() : Event(ui::ET_UNKNOWN, base::TimeTicks(), 0) {}
@@ -44,6 +47,8 @@
 
   // views::ViewObserver:
   void OnViewPreferredSizeChanged(views::View* view) override {
+    if (view->GetPreferredSize() == view->size())
+      return;
     view->SetBoundsRect(gfx::Rect(view->GetPreferredSize()));
     view->Layout();
     ++size_changed_count_;
@@ -61,20 +66,30 @@
     return id;
   }
 
-  void CreateMessageCenterView() {
+  void CreateMessageCenterView(int max_height = kDefaultMaxHeight) {
     message_center_view_ = std::make_unique<NewUnifiedMessageCenterView>();
     message_center_view_->AddObserver(this);
-    message_center_view_->SetMaxHeight(500);
+    message_center_view_->SetMaxHeight(max_height);
     OnViewPreferredSizeChanged(message_center_view_.get());
     size_changed_count_ = 0;
   }
 
+  gfx::Rect GetMessageViewVisibleBounds(int index) {
+    gfx::Rect bounds = GetMessageListView()->child_at(index)->bounds();
+    bounds -= gfx::Vector2d(GetScroller()->GetVisibleRect().OffsetFromOrigin());
+    return bounds;
+  }
+
   UnifiedMessageListView* GetMessageListView() {
     return message_center_view()->message_list_view_;
   }
 
   views::ScrollView* GetScroller() { return message_center_view()->scroller_; }
 
+  MessageCenterScrollBar* GetScrollBar() {
+    return message_center_view()->scroll_bar_;
+  }
+
   views::View* GetScrollerContents() {
     return message_center_view()->scroller_->contents();
   }
@@ -105,6 +120,24 @@
   EXPECT_FALSE(message_center_view()->visible());
 }
 
+TEST_F(NewUnifiedMessageCenterViewTest, ContentsRelayout) {
+  std::vector<std::string> ids;
+  for (size_t i = 0; i < 10; ++i)
+    ids.push_back(AddNotification());
+  CreateMessageCenterView();
+  EXPECT_TRUE(message_center_view()->visible());
+  // MessageCenterView is maxed out.
+  EXPECT_GT(GetMessageListView()->bounds().height(),
+            message_center_view()->bounds().height());
+  const int previous_contents_height = GetScrollerContents()->height();
+  const int previous_list_height = GetMessageListView()->height();
+
+  MessageCenter::Get()->RemoveNotification(ids.back(), true /* by_user */);
+  EXPECT_TRUE(message_center_view()->visible());
+  EXPECT_GT(previous_contents_height, GetScrollerContents()->height());
+  EXPECT_GT(previous_list_height, GetMessageListView()->height());
+}
+
 TEST_F(NewUnifiedMessageCenterViewTest, NotVisibleWhenLocked) {
   AddNotification();
   AddNotification();
@@ -143,4 +176,80 @@
   EXPECT_FALSE(message_center_view()->visible());
 }
 
+TEST_F(NewUnifiedMessageCenterViewTest, InitialPosition) {
+  AddNotification();
+  AddNotification();
+  CreateMessageCenterView();
+  EXPECT_TRUE(message_center_view()->visible());
+
+  // MessageCenterView is not maxed out.
+  EXPECT_LT(GetMessageListView()->bounds().height(),
+            message_center_view()->bounds().height());
+
+  EXPECT_EQ(kUnifiedNotificationCenterSpacing,
+            message_center_view()->bounds().bottom() -
+                GetMessageViewVisibleBounds(1).bottom());
+}
+
+TEST_F(NewUnifiedMessageCenterViewTest, InitialPositionMaxOut) {
+  for (size_t i = 0; i < 6; ++i)
+    AddNotification();
+  CreateMessageCenterView();
+  EXPECT_TRUE(message_center_view()->visible());
+
+  // MessageCenterView is maxed out.
+  EXPECT_GT(GetMessageListView()->bounds().height(),
+            message_center_view()->bounds().height());
+
+  EXPECT_EQ(kUnifiedNotificationCenterSpacing,
+            message_center_view()->bounds().bottom() -
+                GetMessageViewVisibleBounds(5).bottom());
+}
+
+TEST_F(NewUnifiedMessageCenterViewTest, InitialPositionWithLargeNotification) {
+  AddNotification();
+  AddNotification();
+  CreateMessageCenterView(100 /* max_height */);
+  EXPECT_TRUE(message_center_view()->visible());
+
+  // MessageCenterView is shorter than the notification.
+  gfx::Rect message_view_bounds = GetMessageViewVisibleBounds(1);
+  EXPECT_LT(message_center_view()->bounds().height(),
+            message_view_bounds.height());
+
+  // Top of the second notification aligns with the top of MessageCenterView.
+  EXPECT_EQ(0, message_view_bounds.y());
+}
+
+TEST_F(NewUnifiedMessageCenterViewTest, ScrollPositionWhenResized) {
+  for (size_t i = 0; i < 6; ++i)
+    AddNotification();
+  CreateMessageCenterView();
+  EXPECT_TRUE(message_center_view()->visible());
+
+  // MessageCenterView is maxed out.
+  EXPECT_GT(GetMessageListView()->bounds().height(),
+            message_center_view()->bounds().height());
+  gfx::Rect previous_visible_rect = GetScroller()->GetVisibleRect();
+
+  gfx::Size new_size = message_center_view()->size();
+  new_size.set_height(250);
+  message_center_view()->SetPreferredSize(new_size);
+  OnViewPreferredSizeChanged(message_center_view());
+
+  EXPECT_EQ(previous_visible_rect.bottom(),
+            GetScroller()->GetVisibleRect().bottom());
+
+  GetScroller()->ScrollToPosition(GetScrollBar(), 200);
+  message_center_view()->OnMessageCenterScrolled();
+  previous_visible_rect = GetScroller()->GetVisibleRect();
+
+  new_size.set_height(300);
+  message_center_view()->SetPreferredSize(new_size);
+  OnViewPreferredSizeChanged(message_center_view());
+
+  EXPECT_EQ(previous_visible_rect.bottom(),
+            GetScroller()->GetVisibleRect().bottom());
+}
+
 }  // namespace ash
diff --git a/ash/message_center/notification_swipe_control_view.cc b/ash/system/message_center/notification_swipe_control_view.cc
similarity index 98%
rename from ash/message_center/notification_swipe_control_view.cc
rename to ash/system/message_center/notification_swipe_control_view.cc
index 98f651a..19ef56e 100644
--- a/ash/message_center/notification_swipe_control_view.cc
+++ b/ash/system/message_center/notification_swipe_control_view.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/message_center/notification_swipe_control_view.h"
+#include "ash/system/message_center/notification_swipe_control_view.h"
 
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/events/event.h"
diff --git a/ash/message_center/notification_swipe_control_view.h b/ash/system/message_center/notification_swipe_control_view.h
similarity index 91%
rename from ash/message_center/notification_swipe_control_view.h
rename to ash/system/message_center/notification_swipe_control_view.h
index 49016c4..84bb0bc 100644
--- a/ash/message_center/notification_swipe_control_view.h
+++ b/ash/system/message_center/notification_swipe_control_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_MESSAGE_CENTER_NOTIFICATION_SWIPE_CONTROL_VIEW_H_
-#define ASH_MESSAGE_CENTER_NOTIFICATION_SWIPE_CONTROL_VIEW_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_NOTIFICATION_SWIPE_CONTROL_VIEW_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_NOTIFICATION_SWIPE_CONTROL_VIEW_H_
 
 #include "ash/ash_export.h"
 #include "base/macros.h"
@@ -73,4 +73,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_NOTIFICATION_SWIPE_CONTROL_VIEW_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_NOTIFICATION_SWIPE_CONTROL_VIEW_H_
diff --git a/ash/system/message_center/notification_tray.cc b/ash/system/message_center/notification_tray.cc
index 8e154c18..9ae2f105 100644
--- a/ash/system/message_center/notification_tray.cc
+++ b/ash/system/message_center/notification_tray.cc
@@ -7,8 +7,6 @@
 #include <memory>
 
 #include "ash/accessibility/accessibility_controller.h"
-#include "ash/message_center/message_center_bubble.h"
-#include "ash/message_center/message_center_ui_controller.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/resources/vector_icons/vector_icons.h"
@@ -19,6 +17,8 @@
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/message_center/ash_popup_alignment_delegate.h"
+#include "ash/system/message_center/message_center_bubble.h"
+#include "ash/system/message_center/message_center_ui_controller.h"
 #include "ash/system/status_area_widget.h"
 #include "ash/system/tray/tray_bubble_view.h"
 #include "ash/system/tray/tray_bubble_wrapper.h"
diff --git a/ash/system/message_center/notification_tray.h b/ash/system/message_center/notification_tray.h
index 526cd37..406c492 100644
--- a/ash/system/message_center/notification_tray.h
+++ b/ash/system/message_center/notification_tray.h
@@ -9,7 +9,7 @@
 
 #include "ash/ash_export.h"
 #include "ash/login_status.h"
-#include "ash/message_center/message_center_ui_delegate.h"
+#include "ash/system/message_center/message_center_ui_delegate.h"
 #include "ash/system/tray/tray_background_view.h"
 #include "ash/system/tray/tray_bubble_view.h"
 #include "base/gtest_prod_util.h"
diff --git a/ash/system/message_center/notification_tray_unittest.cc b/ash/system/message_center/notification_tray_unittest.cc
index a8ef9be..6ef89781 100644
--- a/ash/system/message_center/notification_tray_unittest.cc
+++ b/ash/system/message_center/notification_tray_unittest.cc
@@ -8,15 +8,15 @@
 #include <utility>
 #include <vector>
 
-#include "ash/message_center/message_center_bubble.h"
-#include "ash/message_center/message_center_ui_controller.h"
-#include "ash/message_center/message_center_view.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_layout_manager.h"
 #include "ash/shell.h"
 #include "ash/system/message_center/ash_popup_alignment_delegate.h"
+#include "ash/system/message_center/message_center_bubble.h"
+#include "ash/system/message_center/message_center_ui_controller.h"
+#include "ash/system/message_center/message_center_view.h"
 #include "ash/system/screen_layout_observer.h"
 #include "ash/system/status_area_widget.h"
 #include "ash/system/status_area_widget_test_helper.h"
diff --git a/ash/message_center/notifier_settings_view.cc b/ash/system/message_center/notifier_settings_view.cc
similarity index 98%
rename from ash/message_center/notifier_settings_view.cc
rename to ash/system/message_center/notifier_settings_view.cc
index d184887..fbea4738 100644
--- a/ash/message_center/notifier_settings_view.cc
+++ b/ash/system/message_center/notifier_settings_view.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/message_center/notifier_settings_view.h"
+#include "ash/system/message_center/notifier_settings_view.h"
 
 #include <stddef.h>
 
@@ -10,13 +10,13 @@
 #include <string>
 #include <utility>
 
-#include "ash/message_center/message_center_controller.h"
-#include "ash/message_center/message_center_style.h"
-#include "ash/message_center/message_center_view.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/system/message_center/message_center_controller.h"
+#include "ash/system/message_center/message_center_style.h"
+#include "ash/system/message_center/message_center_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_popup_utils.h"
 #include "base/macros.h"
diff --git a/ash/message_center/notifier_settings_view.h b/ash/system/message_center/notifier_settings_view.h
similarity index 92%
rename from ash/message_center/notifier_settings_view.h
rename to ash/system/message_center/notifier_settings_view.h
index f4e5adb..32d2442 100644
--- a/ash/message_center/notifier_settings_view.h
+++ b/ash/system/message_center/notifier_settings_view.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_MESSAGE_CENTER_NOTIFIER_SETTINGS_VIEW_H_
-#define ASH_MESSAGE_CENTER_NOTIFIER_SETTINGS_VIEW_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_NOTIFIER_SETTINGS_VIEW_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_NOTIFIER_SETTINGS_VIEW_H_
 
 #include <memory>
 #include <set>
 
 #include "ash/ash_export.h"
-#include "ash/message_center/message_center_controller.h"
+#include "ash/system/message_center/message_center_controller.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "ui/message_center/public/cpp/notifier_id.h"
@@ -107,4 +107,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_NOTIFIER_SETTINGS_VIEW_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_NOTIFIER_SETTINGS_VIEW_H_
diff --git a/ash/message_center/notifier_settings_view_unittest.cc b/ash/system/message_center/notifier_settings_view_unittest.cc
similarity index 96%
rename from ash/message_center/notifier_settings_view_unittest.cc
rename to ash/system/message_center/notifier_settings_view_unittest.cc
index 306051fc..f18c95d 100644
--- a/ash/message_center/notifier_settings_view_unittest.cc
+++ b/ash/system/message_center/notifier_settings_view_unittest.cc
@@ -5,10 +5,10 @@
 #include <stddef.h>
 #include <memory>
 
-#include "ash/message_center/message_center_controller.h"
-#include "ash/message_center/notifier_settings_view.h"
 #include "ash/public/interfaces/ash_message_center_controller.mojom.h"
 #include "ash/shell.h"
+#include "ash/system/message_center/message_center_controller.h"
+#include "ash/system/message_center/notifier_settings_view.h"
 #include "ash/test/ash_test_base.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
diff --git a/ash/system/message_center/session_state_notification_blocker.cc b/ash/system/message_center/session_state_notification_blocker.cc
index 82e4375..0e2a98c2 100644
--- a/ash/system/message_center/session_state_notification_blocker.cc
+++ b/ash/system/message_center/session_state_notification_blocker.cc
@@ -4,9 +4,9 @@
 
 #include "ash/system/message_center/session_state_notification_blocker.h"
 
-#include "ash/message_center/ash_message_center_lock_screen_controller.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
+#include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
 #include "ui/message_center/message_center.h"
 
 using session_manager::SessionState;
diff --git a/ash/message_center/slidable_message_view.cc b/ash/system/message_center/slidable_message_view.cc
similarity index 94%
rename from ash/message_center/slidable_message_view.cc
rename to ash/system/message_center/slidable_message_view.cc
index 1ae563e8..7c91022c 100644
--- a/ash/message_center/slidable_message_view.cc
+++ b/ash/system/message_center/slidable_message_view.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/message_center/slidable_message_view.h"
+#include "ash/system/message_center/slidable_message_view.h"
 
-#include "ash/message_center/notification_swipe_control_view.h"
+#include "ash/system/message_center/notification_swipe_control_view.h"
 #include "ui/message_center/public/cpp/features.h"
 #include "ui/message_center/public/cpp/message_center_constants.h"
 #include "ui/message_center/views/message_view.h"
diff --git a/ash/message_center/slidable_message_view.h b/ash/system/message_center/slidable_message_view.h
similarity index 88%
rename from ash/message_center/slidable_message_view.h
rename to ash/system/message_center/slidable_message_view.h
index 87d86d9..15153ec 100644
--- a/ash/message_center/slidable_message_view.h
+++ b/ash/system/message_center/slidable_message_view.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_MESSAGE_CENTER_SLIDABLE_MESSAGE_VIEW_H_
-#define ASH_MESSAGE_CENTER_SLIDABLE_MESSAGE_VIEW_H_
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_SLIDABLE_MESSAGE_VIEW_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_SLIDABLE_MESSAGE_VIEW_H_
 
 #include "ash/ash_export.h"
-#include "ash/message_center/notification_swipe_control_view.h"
+#include "ash/system/message_center/notification_swipe_control_view.h"
 #include "ui/message_center/views/message_view.h"
 #include "ui/views/view.h"
 
@@ -67,4 +67,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_MESSAGE_CENTER_SLIDABLE_MESSAGE_VIEW_H_
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_SLIDABLE_MESSAGE_VIEW_H_
diff --git a/ash/system/message_center/unified_message_center_view.cc b/ash/system/message_center/unified_message_center_view.cc
index 53ba0746..5d8602a 100644
--- a/ash/system/message_center/unified_message_center_view.cc
+++ b/ash/system/message_center/unified_message_center_view.cc
@@ -4,8 +4,8 @@
 
 #include "ash/system/message_center/unified_message_center_view.h"
 
-#include "ash/message_center/message_center_scroll_bar.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/system/message_center/message_center_scroll_bar.h"
 #include "ash/system/unified/sign_out_button.h"
 #include "ash/system/unified/unified_system_tray_controller.h"
 #include "ash/system/unified/unified_system_tray_view.h"
diff --git a/ash/system/message_center/unified_message_center_view.h b/ash/system/message_center/unified_message_center_view.h
index 433992c..eca66189 100644
--- a/ash/system/message_center/unified_message_center_view.h
+++ b/ash/system/message_center/unified_message_center_view.h
@@ -8,8 +8,8 @@
 #include <stddef.h>
 
 #include "ash/ash_export.h"
-#include "ash/message_center/message_center_scroll_bar.h"
-#include "ash/message_center/message_list_view.h"
+#include "ash/system/message_center/message_center_scroll_bar.h"
+#include "ash/system/message_center/message_list_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "base/macros.h"
 #include "ui/message_center/message_center_observer.h"
diff --git a/ash/system/message_center/unified_message_list_view.cc b/ash/system/message_center/unified_message_list_view.cc
index d167e0d..dc94130 100644
--- a/ash/system/message_center/unified_message_list_view.cc
+++ b/ash/system/message_center/unified_message_list_view.cc
@@ -5,13 +5,14 @@
 #include "ash/system/message_center/unified_message_list_view.h"
 
 #include "ash/system/message_center/new_unified_message_center_view.h"
+#include "ash/system/message_center/notification_swipe_control_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "base/auto_reset.h"
 #include "ui/message_center/message_center.h"
-#include "ui/message_center/views/message_view.h"
 #include "ui/message_center/views/message_view_factory.h"
 #include "ui/views/border.h"
 #include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/fill_layout.h"
 
 using message_center::Notification;
 using message_center::MessageCenter;
@@ -19,6 +20,71 @@
 
 namespace ash {
 
+// Container view of notification and swipe control.
+// All children of UnifiedMessageListView should be MessageViewContainer.
+class UnifiedMessageListView::MessageViewContainer
+    : public views::View,
+      public MessageView::SlideObserver {
+ public:
+  explicit MessageViewContainer(MessageView* message_view)
+      : message_view_(message_view),
+        control_view_(new NotificationSwipeControlView(message_view)) {
+    message_view_->AddSlideObserver(this);
+
+    SetLayoutManager(std::make_unique<views::FillLayout>());
+    AddChildView(control_view_);
+    AddChildView(message_view_);
+  }
+
+  ~MessageViewContainer() override = default;
+
+  // Update the border and background corners based on if the notification is
+  // at the top or the bottom.
+  void UpdateBorder(bool is_top, bool is_bottom) {
+    message_view_->SetBorder(
+        is_bottom ? views::NullBorder()
+                  : views::CreateSolidSidedBorder(
+                        0, 0, kUnifiedNotificationSeparatorThickness, 0,
+                        kUnifiedNotificationSeparatorColor));
+    const int top_radius = is_top ? kUnifiedTrayCornerRadius : 0;
+    const int bottom_radius = is_bottom ? kUnifiedTrayCornerRadius : 0;
+    message_view_->UpdateCornerRadius(top_radius, bottom_radius);
+    control_view_->UpdateCornerRadius(top_radius, bottom_radius);
+  }
+
+  // Collapses the notification if its state haven't changed manually by a user.
+  void Collapse() {
+    if (!message_view_->IsManuallyExpandedOrCollapsed())
+      message_view_->SetExpanded(false);
+  }
+
+  std::string GetNotificationId() const {
+    return message_view_->notification_id();
+  }
+
+  void UpdateWithNotification(const Notification& notification) {
+    message_view_->UpdateWithNotification(notification);
+  }
+
+  void CloseSwipeControl() { message_view_->CloseSwipeControl(); }
+
+  // views::View:
+  void ChildPreferredSizeChanged(views::View* child) override {
+    PreferredSizeChanged();
+  }
+
+  // MessageView::SlideObserver:
+  void OnSlideChanged(const std::string& notification_id) override {
+    control_view_->UpdateButtonsVisibility();
+  }
+
+ private:
+  MessageView* const message_view_;
+  NotificationSwipeControlView* const control_view_;
+
+  DISALLOW_COPY_AND_ASSIGN(MessageViewContainer);
+};
+
 UnifiedMessageListView::UnifiedMessageListView(
     NewUnifiedMessageCenterView* message_center_view)
     : message_center_view_(message_center_view) {
@@ -39,13 +105,19 @@
     // Expand the latest notification, and collapse all other notifications.
     view->SetExpanded(is_latest && view->IsAutoExpandingAllowed());
     is_latest = false;
-    AddChildViewAt(view, 0);
+    AddChildViewAt(new MessageViewContainer(view), 0);
     MessageCenter::Get()->DisplayedNotification(
         notification->id(), message_center::DISPLAY_SOURCE_MESSAGE_CENTER);
   }
   UpdateBorders();
 }
 
+int UnifiedMessageListView::GetLastNotificationHeight() const {
+  if (!has_children())
+    return 0;
+  return child_at(child_count() - 1)->bounds().height();
+}
+
 void UnifiedMessageListView::ChildPreferredSizeChanged(views::View* child) {
   if (ignore_size_change_)
     return;
@@ -69,7 +141,7 @@
   auto* view = CreateMessageView(*notification);
   // Expand the latest notification.
   view->SetExpanded(view->IsAutoExpandingAllowed());
-  AddChildView(view);
+  AddChildView(new MessageViewContainer(view));
   UpdateBorders();
   PreferredSizeChanged();
 }
@@ -77,8 +149,8 @@
 void UnifiedMessageListView::OnNotificationRemoved(const std::string& id,
                                                    bool by_user) {
   for (int i = 0; i < child_count(); ++i) {
-    auto* view = static_cast<message_center::MessageView*>(child_at(i));
-    if (view->notification_id() == id) {
+    auto* view = GetContainer(i);
+    if (view->GetNotificationId() == id) {
       delete view;
       break;
     }
@@ -94,8 +166,8 @@
     return;
 
   for (int i = 0; i < child_count(); ++i) {
-    auto* view = static_cast<message_center::MessageView*>(child_at(i));
-    if (view->notification_id() == id) {
+    auto* view = GetContainer(i);
+    if (view->GetNotificationId() == id) {
       view->UpdateWithNotification(*notification);
       break;
     }
@@ -104,36 +176,43 @@
   PreferredSizeChanged();
 }
 
-message_center::MessageView* UnifiedMessageListView::CreateMessageView(
-    const Notification& notification) const {
+void UnifiedMessageListView::OnSlideChanged(
+    const std::string& notification_id) {
+  // When the swipe control for |notification_id| is shown, hide all other swipe
+  // controls.
+  for (int i = 0; i < child_count(); ++i) {
+    auto* view = GetContainer(i);
+    if (view->GetNotificationId() == notification_id)
+      continue;
+    view->CloseSwipeControl();
+  }
+}
+
+MessageView* UnifiedMessageListView::CreateMessageView(
+    const Notification& notification) {
   auto* view = message_center::MessageViewFactory::Create(notification);
   view->SetIsNested();
-  if (message_center_view_)
-    message_center_view_->ConfigureMessageView(view);
+  view->AddSlideObserver(this);
+  message_center_view_->ConfigureMessageView(view);
   return view;
 }
 
+UnifiedMessageListView::MessageViewContainer*
+UnifiedMessageListView::GetContainer(int index) {
+  return static_cast<MessageViewContainer*>(child_at(index));
+}
+
 void UnifiedMessageListView::CollapseAllNotifications() {
   base::AutoReset<bool> auto_reset(&ignore_size_change_, true);
-  for (int i = 0; i < child_count(); ++i) {
-    auto* view = static_cast<message_center::MessageView*>(child_at(i));
-    if (!view->IsManuallyExpandedOrCollapsed())
-      view->SetExpanded(false);
-  }
+  for (int i = 0; i < child_count(); ++i)
+    GetContainer(i)->Collapse();
 }
 
 void UnifiedMessageListView::UpdateBorders() {
   for (int i = 0; i < child_count(); ++i) {
-    auto* view = static_cast<message_center::MessageView*>(child_at(i));
     const bool is_top = i == 0;
     const bool is_bottom = i == child_count() - 1;
-    view->UpdateCornerRadius(is_top ? kUnifiedTrayCornerRadius : 0,
-                             is_bottom ? kUnifiedTrayCornerRadius : 0);
-    view->SetBorder(is_bottom
-                        ? views::NullBorder()
-                        : views::CreateSolidSidedBorder(
-                              0, 0, kUnifiedNotificationSeparatorThickness, 0,
-                              kUnifiedNotificationSeparatorColor));
+    GetContainer(i)->UpdateBorder(is_top, is_bottom);
   }
 }
 
diff --git a/ash/system/message_center/unified_message_list_view.h b/ash/system/message_center/unified_message_list_view.h
index 54b0607c..7f89057 100644
--- a/ash/system/message_center/unified_message_list_view.h
+++ b/ash/system/message_center/unified_message_list_view.h
@@ -7,6 +7,7 @@
 
 #include "ash/ash_export.h"
 #include "ui/message_center/message_center_observer.h"
+#include "ui/message_center/views/message_view.h"
 #include "ui/views/view.h"
 
 namespace message_center {
@@ -22,7 +23,8 @@
 // it's enclosed. This class is used only from NewUnifiedMessageCenterView.
 class ASH_EXPORT UnifiedMessageListView
     : public views::View,
-      public message_center::MessageCenterObserver {
+      public message_center::MessageCenterObserver,
+      public message_center::MessageView::SlideObserver {
  public:
   // |message_center_view| can be null in unit tests.
   explicit UnifiedMessageListView(
@@ -33,6 +35,10 @@
   // after ctor.
   void Init();
 
+  // Get the height of the notification at the bottom. If no notification is
+  // added, it returns 0.
+  int GetLastNotificationHeight() const;
+
   // views::View:
   void ChildPreferredSizeChanged(views::View* child) override;
   void PreferredSizeChanged() override;
@@ -42,12 +48,18 @@
   void OnNotificationRemoved(const std::string& id, bool by_user) override;
   void OnNotificationUpdated(const std::string& id) override;
 
+  // message_center::MessageView::SlideObserver:
+  void OnSlideChanged(const std::string& notification_id) override;
+
  protected:
   // Virtual for testing.
   virtual message_center::MessageView* CreateMessageView(
-      const message_center::Notification& notification) const;
+      const message_center::Notification& notification);
 
  private:
+  class MessageViewContainer;
+
+  MessageViewContainer* GetContainer(int index);
   void CollapseAllNotifications();
   void UpdateBorders();
 
diff --git a/ash/system/message_center/unified_message_list_view_unittest.cc b/ash/system/message_center/unified_message_list_view_unittest.cc
index 763b6aa..0c7a331 100644
--- a/ash/system/message_center/unified_message_list_view_unittest.cc
+++ b/ash/system/message_center/unified_message_list_view_unittest.cc
@@ -52,7 +52,7 @@
 
   // UnifiedMessageListView:
   message_center::MessageView* CreateMessageView(
-      const message_center::Notification& notification) const override {
+      const message_center::Notification& notification) override {
     auto* view = new TestNotificationView(notification);
     view->SetIsNested();
     return view;
@@ -104,7 +104,11 @@
 
   TestNotificationView* GetMessageViewAt(int index) const {
     return static_cast<TestNotificationView*>(
-        message_list_view()->child_at(index));
+        message_list_view()->child_at(index)->child_at(1));
+  }
+
+  gfx::Rect GetMessageViewBounds(int index) const {
+    return message_list_view()->child_at(index)->bounds();
   }
 
   UnifiedMessageListView* message_list_view() const {
@@ -137,10 +141,8 @@
   EXPECT_FALSE(GetMessageViewAt(1)->IsExpanded());
   EXPECT_TRUE(GetMessageViewAt(2)->IsExpanded());
 
-  EXPECT_EQ(GetMessageViewAt(0)->bounds().bottom(),
-            GetMessageViewAt(1)->bounds().y());
-  EXPECT_EQ(GetMessageViewAt(1)->bounds().bottom(),
-            GetMessageViewAt(2)->bounds().y());
+  EXPECT_EQ(GetMessageViewBounds(0).bottom(), GetMessageViewBounds(1).y());
+  EXPECT_EQ(GetMessageViewBounds(1).bottom(), GetMessageViewBounds(2).y());
 
   EXPECT_EQ(kUnifiedTrayCornerRadius, GetMessageViewAt(0)->top_radius());
   EXPECT_EQ(0, GetMessageViewAt(1)->top_radius());
@@ -168,7 +170,7 @@
   int previous_height = message_list_view()->GetPreferredSize().height();
   EXPECT_LT(0, previous_height);
 
-  gfx::Rect previous_bounds = GetMessageViewAt(0)->bounds();
+  gfx::Rect previous_bounds = GetMessageViewBounds(0);
 
   auto id1 = AddNotification();
   EXPECT_EQ(2, size_changed_count());
@@ -178,9 +180,8 @@
   EXPECT_LT(previous_height, message_list_view()->GetPreferredSize().height());
   // 1dip larger because now it has separator border.
   previous_bounds.Inset(gfx::Insets(0, 0, -1, 0));
-  EXPECT_EQ(previous_bounds, GetMessageViewAt(0)->bounds());
-  EXPECT_EQ(GetMessageViewAt(0)->bounds().bottom(),
-            GetMessageViewAt(1)->bounds().y());
+  EXPECT_EQ(previous_bounds, GetMessageViewBounds(0));
+  EXPECT_EQ(GetMessageViewBounds(0).bottom(), GetMessageViewBounds(1).y());
 
   EXPECT_EQ(kUnifiedTrayCornerRadius, GetMessageViewAt(0)->top_radius());
   EXPECT_EQ(0, GetMessageViewAt(1)->top_radius());
@@ -199,10 +200,10 @@
   EXPECT_EQ(kUnifiedTrayCornerRadius, GetMessageViewAt(0)->top_radius());
   EXPECT_EQ(0, GetMessageViewAt(0)->bottom_radius());
 
-  gfx::Rect previous_bounds = GetMessageViewAt(0)->bounds();
+  gfx::Rect previous_bounds = GetMessageViewBounds(0);
   MessageCenter::Get()->RemoveNotification(id0, true /* by_user */);
   EXPECT_EQ(1, size_changed_count());
-  EXPECT_EQ(previous_bounds.y(), GetMessageViewAt(0)->bounds().y());
+  EXPECT_EQ(previous_bounds.y(), GetMessageViewBounds(0).y());
   EXPECT_LT(0, message_list_view()->GetPreferredSize().height());
   EXPECT_GT(previous_height, message_list_view()->GetPreferredSize().height());
 
diff --git a/ash/system/power/power_status.cc b/ash/system/power/power_status.cc
index e49cbf9..51aec02a 100644
--- a/ash/system/power/power_status.cc
+++ b/ash/system/power/power_status.cc
@@ -68,17 +68,22 @@
     const float dsf = canvas->UndoDeviceScaleFactor();
     // All constants below are expressed relative to a canvas size of 16. The
     // actual canvas size (i.e. |size()|) may not be 16.
-    const float kAssumedCanvasSize = 16;
+    const float kAssumedCanvasSize =
+        features::IsSystemTrayUnifiedEnabled() ? 20 : 16;
     const float const_scale = dsf * size().height() / kAssumedCanvasSize;
 
     // The two shapes in this path define the outline of the battery icon.
     SkPath path;
-    gfx::RectF top(6.5f, 2, 3, 1);
+    gfx::RectF top = features::IsSystemTrayUnifiedEnabled()
+                         ? gfx::RectF(8, 3, 4, 2)
+                         : gfx::RectF(6.5f, 2, 3, 1);
     top.Scale(const_scale);
     top = gfx::RectF(gfx::ToEnclosingRect(top));
     path.addRect(gfx::RectFToSkRect(top));
 
-    gfx::RectF bottom(4.5f, 3, 7, 11);
+    gfx::RectF bottom = features::IsSystemTrayUnifiedEnabled()
+                            ? gfx::RectF(6, 5, 8, 12)
+                            : gfx::RectF(4.5f, 3, 7, 11);
     bottom.Scale(const_scale);
     // Align the top of bottom rect to the bottom of the top one. Otherwise,
     // they may overlap and the top will be too small.
diff --git a/ash/system/unified/quiet_mode_feature_pod_controller.h b/ash/system/unified/quiet_mode_feature_pod_controller.h
index b9515df9..9cd6e7a9 100644
--- a/ash/system/unified/quiet_mode_feature_pod_controller.h
+++ b/ash/system/unified/quiet_mode_feature_pod_controller.h
@@ -6,7 +6,7 @@
 #define ASH_SYSTEM_UNIFIED_QUIET_MODE_FEATURE_POD_CONTROLLER_H_
 
 #include "ash/ash_export.h"
-#include "ash/message_center/message_center_controller.h"
+#include "ash/system/message_center/message_center_controller.h"
 #include "ash/system/unified/feature_pod_controller_base.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
diff --git a/ash/system/unified/unified_notifier_settings_controller.cc b/ash/system/unified/unified_notifier_settings_controller.cc
index 45babca..2e869e8 100644
--- a/ash/system/unified/unified_notifier_settings_controller.cc
+++ b/ash/system/unified/unified_notifier_settings_controller.cc
@@ -4,8 +4,8 @@
 
 #include "ash/system/unified/unified_notifier_settings_controller.h"
 
-#include "ash/message_center/notifier_settings_view.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/system/message_center/notifier_settings_view.h"
 #include "ash/system/tray/tray_detailed_view.h"
 #include "ash/system/unified/unified_detailed_view_delegate.h"
 #include "ui/message_center/message_center_observer.h"
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index a4e4d1d..6737801f 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -5,13 +5,13 @@
 #include "ash/system/unified/unified_system_tray.h"
 
 #include "ash/accessibility/accessibility_controller.h"
-#include "ash/message_center/message_center_ui_controller.h"
-#include "ash/message_center/message_center_ui_delegate.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/date/date_view.h"
 #include "ash/system/date/tray_system_info.h"
 #include "ash/system/message_center/ash_popup_alignment_delegate.h"
+#include "ash/system/message_center/message_center_ui_controller.h"
+#include "ash/system/message_center/message_center_ui_delegate.h"
 #include "ash/system/model/clock_model.h"
 #include "ash/system/model/system_tray_model.h"
 #include "ash/system/network/network_tray_view.h"
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc
index 48fe736..2fa6aa53 100644
--- a/ash/system/unified/unified_system_tray_view.cc
+++ b/ash/system/unified/unified_system_tray_view.cc
@@ -4,11 +4,11 @@
 
 #include "ash/system/unified/unified_system_tray_view.h"
 
-#include "ash/message_center/ash_message_center_lock_screen_controller.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
+#include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
 #include "ash/system/message_center/new_unified_message_center_view.h"
 #include "ash/system/message_center/unified_message_center_view.h"
 #include "ash/system/tray/interacted_by_tap_recorder.h"
diff --git a/ash/wm/immersive_fullscreen_controller_unittest.cc b/ash/wm/immersive_fullscreen_controller_unittest.cc
index a609f41..c62c996 100644
--- a/ash/wm/immersive_fullscreen_controller_unittest.cc
+++ b/ash/wm/immersive_fullscreen_controller_unittest.cc
@@ -178,9 +178,10 @@
     top_container_->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
     widget_->GetContentsView()->AddChildView(top_container_);
 
-    delegate_.reset(
-        new MockImmersiveFullscreenControllerDelegate(top_container_));
-    controller_.reset(new ImmersiveFullscreenController);
+    delegate_ = std::make_unique<MockImmersiveFullscreenControllerDelegate>(
+        top_container_);
+    controller_ = std::make_unique<ImmersiveFullscreenController>(
+        Shell::Get()->immersive_context());
     controller_->Init(delegate_.get(), widget_, top_container_);
     ImmersiveFullscreenControllerTestApi(controller_.get()).SetupForTest();
 
diff --git a/build/android/gyp/dex.py b/build/android/gyp/dex.py
index 78ade4b5..7fba5db 100755
--- a/build/android/gyp/dex.py
+++ b/build/android/gyp/dex.py
@@ -56,8 +56,14 @@
                     help='A JSON file containing multidex build configuration.')
   parser.add_option('--multi-dex', default=False, action='store_true',
                     help='Generate multiple dex files.')
-  parser.add_option('--d8-jar-path',
-                    help='Path to D8 jar.')
+  parser.add_option('--d8-jar-path', help='Path to D8 jar.')
+  parser.add_option('--release', action='store_true', default=False,
+                    help='Run D8 in release mode. Release mode maximises main '
+                    'dex and deletes non-essential line number information '
+                    '(vs debug which minimizes main dex and keeps all line '
+                    'number information, and then some.')
+  parser.add_option('--min-api',
+                    help='Minimum Android API level compatibility.')
 
   parser.add_option('--dexlayout-profile',
                     help=('Text profile for dexlayout. If present, a dexlayout '
@@ -314,9 +320,16 @@
   if options.multi_dex:
     input_paths.append(options.main_dex_list_path)
 
-  dex_cmd = ['java', '-jar', options.d8_jar_path]
+  dex_cmd = ['java', '-jar', options.d8_jar_path, '--no-desugaring']
   if options.multi_dex:
     dex_cmd += ['--main-dex-list', options.main_dex_list_path]
+  if options.release:
+    dex_cmd += ['--release']
+  if options.min_api:
+    # TODO(mheikal): Actually pass min-api once catapult/devil dexdump has been
+    # updated. see https://crbug.com/892644
+    # dex_cmd += ['--min-api', options.min_api]
+    pass
 
   is_dex = options.dex_path.endswith('.dex')
   is_jar = options.dex_path.endswith('.jar')
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 3226846..d393bc6 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1202,6 +1202,17 @@
         args += rebase_path(invoker.input_jars, root_build_dir)
       }
 
+      if (!is_java_debug) {
+        args += [ "--release" ]
+      }
+
+      if (defined(invoker.min_sdk_version)) {
+        args += [
+          "--min-api",
+          "${invoker.min_sdk_version}",
+        ]
+      }
+
       _d8_path = "//third_party/r8/lib/d8.jar"
       inputs += [ _d8_path ]
       args += [
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 29510a0..c7693e0 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1908,6 +1908,9 @@
     _build_config = "$target_gen_dir/$target_name.build_config"
     _build_config_target = "${target_name}__build_config"
 
+    # Mark as used
+    assert(!defined(invoker.min_sdk_version) || invoker.min_sdk_version != 0)
+
     # JUnit tests use resource zip files. These must not be put in gen/
     # directory or they will not be available to tester bots.
     _jar_path = "$_base_path.jar"
@@ -2500,6 +2503,7 @@
 
       _final_dex_target_name = "${_template_name}__final_dex"
       dex("$_final_dex_target_name") {
+        forward_variables_from(invoker, [ "min_sdk_version" ])
         deps = _dex_deps + [ ":$_build_config_target" ]
         input_jars = _dex_sources
         output = _final_dex_path
@@ -2890,6 +2894,7 @@
                                "keystore_path",
                                "load_library_from_apk",
                                "loadable_modules",
+                               "min_sdk_version",
                                "native_lib_placeholders",
                                "native_lib_version_arg",
                                "native_lib_version_rule",
@@ -2988,6 +2993,7 @@
                                "javac_args",
                                "load_library_from_apk",
                                "loadable_modules",
+                               "min_sdk_version",
                                "native_lib_placeholders",
                                "native_lib_version_arg",
                                "native_lib_version_rule",
diff --git a/build/toolchain/linux/BUILD.gn b/build/toolchain/linux/BUILD.gn
index 4e9ff44..1b0f2205 100644
--- a/build/toolchain/linux/BUILD.gn
+++ b/build/toolchain/linux/BUILD.gn
@@ -215,6 +215,14 @@
   }
 }
 
+clang_toolchain("clang_s390x") {
+  toolchain_args = {
+    current_cpu = "s390x"
+    current_os = "linux"
+    is_clang = true
+  }
+}
+
 gcc_toolchain("s390x") {
   cc = "gcc"
   cxx = "g++"
diff --git a/chrome/VERSION b/chrome/VERSION
index 3ac181d6..f49d194d 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=71
 MINOR=0
-BUILD=3577
+BUILD=3578
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 717ca65..1279138c 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1355,9 +1355,11 @@
     deps = _chrome_public_and_sync_shell_shared_deps
 
     if (_is_modern) {
+      min_sdk_version = 21
       android_manifest = chrome_modern_public_android_manifest
       android_manifest_dep = ":chrome_modern_public_android_manifest"
     } else {
+      min_sdk_version = 16
       android_manifest = chrome_public_android_manifest
       android_manifest_dep = ":chrome_public_android_manifest"
     }
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index 6ac060b..ce88a322 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -220,6 +220,7 @@
     alternative_android_sdk_dep = webview_framework_dep
     app_as_shared_lib = true
     use_chromium_linker = false
+    min_sdk_version = 24
 
     # Webview supports all locales (has no omitted ones).
     aapt_locale_whitelist = locales
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml
index 1c8a76f..f98a4c6 100644
--- a/chrome/android/java/res/values-v17/styles.xml
+++ b/chrome/android/java/res/values-v17/styles.xml
@@ -611,6 +611,7 @@
         <item name="android:paddingEnd">0dp</item>
         <item name="android:textAppearance">@style/BlueLink2</item>
     </style>
+    <style name="NavigationPopupDialog" parent="Widget.AppCompat.Light.ListPopupWindow" />
 
     <!-- New Tab Page -->
     <style name="NewTabPageRecyclerView">
diff --git a/chrome/android/java/res/values-v21/styles.xml b/chrome/android/java/res/values-v21/styles.xml
index af6c63cb..e0fa26f 100644
--- a/chrome/android/java/res/values-v21/styles.xml
+++ b/chrome/android/java/res/values-v21/styles.xml
@@ -4,6 +4,10 @@
      found in the LICENSE file. -->
 
 <resources>
+    <style name="NavigationPopupDialog" parent="Widget.AppCompat.Light.ListPopupWindow">
+        <item name="android:popupElevation">0dp</item>
+    </style>
+
     <!-- Preferences -->
     <style name="PreferencesTheme" parent="ThemeWithActionBar">
         <item name="android:textColorLink">@color/pref_accent_color</item>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index 3fb7b430..8ec885a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -695,7 +695,7 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
+            public void onCrash(Tab tab) {
                 postDeferredStartupIfNeeded();
             }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java b/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java
index d0b0c36e..3f84fb4c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java
@@ -105,7 +105,7 @@
 
         mAdapter = new NavigationAdapter();
 
-        mPopup = new ListPopupWindow(context);
+        mPopup = new ListPopupWindow(context, null, 0, R.style.NavigationPopupDialog);
         mPopup.setOnDismissListener(this::onDismiss);
         mPopup.setBackgroundDrawable(ApiCompatibilityUtils.getDrawable(
                 resources, anchorToBottom ? R.drawable.popup_bg_bottom : R.drawable.popup_bg));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryData.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryData.java
index f79a4ab..56b9249 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryData.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/KeyboardAccessoryData.java
@@ -8,6 +8,7 @@
 import android.graphics.drawable.Drawable;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.Nullable;
+import android.support.annotation.Px;
 import android.view.ViewGroup;
 
 import org.chromium.base.Callback;
@@ -198,7 +199,7 @@
              * synchronously (depending on whether the icon was cached).
              * @param favicon The icon to be used for this Item. If null, use the default icon.
              */
-            void fetchFavicon(Callback<Bitmap> favicon);
+            void fetchFavicon(@Px int desiredSize, Callback<Bitmap> favicon);
         }
 
         /**
@@ -317,12 +318,12 @@
             return mItemSelectedCallback;
         }
 
-        public void fetchFavicon(Callback<Bitmap> faviconCallback) {
+        public void fetchFavicon(@Px int desiredSize, Callback<Bitmap> faviconCallback) {
             if (mFaviconProvider == null) {
                 faviconCallback.onResult(null); // Use default icon without provider.
                 return;
             }
-            mFaviconProvider.fetchFavicon(faviconCallback);
+            mFaviconProvider.fetchFavicon(desiredSize, faviconCallback);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java
index 2f1b977..145fb92 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.autofill.keyboard_accessory;
 
 import android.graphics.Bitmap;
+import android.support.annotation.Px;
 
 import org.chromium.base.Callback;
 import org.chromium.base.annotations.CalledByNative;
@@ -128,13 +129,13 @@
         return items;
     }
 
-    public void fetchFavicon(Callback<Bitmap> faviconCallback) {
+    public void fetchFavicon(@Px int desiredSize, Callback<Bitmap> faviconCallback) {
         assert mNativeView != 0 : "Favicon was requested after the bridge was destroyed!";
-        nativeOnFaviconRequested(mNativeView, faviconCallback);
+        nativeOnFaviconRequested(mNativeView, desiredSize, faviconCallback);
     }
 
-    private native void nativeOnFaviconRequested(
-            long nativePasswordAccessoryViewAndroid, Callback<Bitmap> faviconCallback);
+    private native void nativeOnFaviconRequested(long nativePasswordAccessoryViewAndroid,
+            int desiredSizeInPx, Callback<Bitmap> faviconCallback);
     private native void nativeOnFillingTriggered(
             long nativePasswordAccessoryViewAndroid, boolean isPassword, String textToFill);
     private native void nativeOnOptionSelected(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewBinder.java
index d9ccf09e..7f0a69f4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewBinder.java
@@ -155,7 +155,9 @@
             // Jelly Bean, so the padding should be set after the background.
             if (!item.isPassword()) {
                 setIconForBitmap(null); // Set the default icon, then try to get a better one.
-                item.fetchFavicon(this::setIconForBitmap);
+                item.fetchFavicon(itemView.getContext().getResources().getDimensionPixelSize(
+                                          R.dimen.keyboard_accessory_suggestion_icon_size),
+                        this::setIconForBitmap);
                 mSuggestionText.setPadding(mPadding, 0, mPadding, 0);
             } else {
                 ApiCompatibilityUtils.setCompoundDrawablesRelative(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
index f71a20c..ab1727d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
@@ -36,6 +36,7 @@
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
 import org.chromium.chrome.browser.ntp.NewTabPage;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.Tab.TabHidingType;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
@@ -617,7 +618,7 @@
                 || (url != null && url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX));
         int themeColor = tab.getThemeColor();
 
-        boolean canUseLiveTexture = tab.getWebContents() != null && !tab.isShowingSadTab()
+        boolean canUseLiveTexture = tab.getWebContents() != null && !SadTab.isShowing(tab)
                 && !isNativePage && !tab.isHidden();
 
         boolean isNtp = tab.getNativePage() instanceof NewTabPage;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
index b98ec616..212e8eaa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -383,7 +383,7 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
+            public void onCrash(Tab tab) {
                 getStripLayoutHelper(tab.isIncognito()).tabPageLoadFinished(tab.getId());
             }
         };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/FetchHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/FetchHelper.java
index 238d17f..a8547f9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/FetchHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/FetchHelper.java
@@ -15,6 +15,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
@@ -493,7 +494,7 @@
         String url = currentTab.getUrl();
         if (TextUtils.isEmpty(url)) return false;
         if (currentTab.isShowingErrorPage() || currentTab.isShowingInterstitialPage()
-                || currentTab.isShowingSadTab()) {
+                || SadTab.isShowing(currentTab)) {
             return false;
         }
         return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
index bb84e59..e8ac7ba 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -34,6 +34,7 @@
 import org.chromium.chrome.browser.gsa.GSAContextDisplaySelection;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabRedirectHandler;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
@@ -582,8 +583,8 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
-                if (sadTabShown) {
+            public void onCrash(Tab tab) {
+                if (SadTab.isShowing(tab)) {
                     // Hide contextual search if the foreground tab crashed
                     hideContextualSearch(StateChangeReason.UNKNOWN);
                 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
index b1d0060..f31fedc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -219,7 +219,7 @@
         }
 
         @Override
-        public void onCrash(Tab tab, boolean sadTabShown) {
+        public void onCrash(Tab tab) {
             final CustomTabsConnection connection = mCustomTabsConnection;
             ThreadUtils.postOnUiThread(() -> { connection.cancelSpeculation(null /* session */); });
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
index e0b650af..3195754 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
@@ -24,6 +24,7 @@
     private DownloadInfo mDownloadInfo;
     private long mDownloadId = INVALID_DOWNLOAD_ID;
     private long mStartTime;
+    private long mEndTime;
     private boolean mHasBeenExternallyRemoved;
 
     public DownloadItem(boolean useAndroidDownloadManager, DownloadInfo info) {
@@ -112,6 +113,24 @@
     }
 
     /**
+     * Sets the download end time.
+     *
+     * @param endTime Download end time from System.currentTimeMillis().
+     */
+    public void setEndTime(long endTime) {
+        mEndTime = endTime;
+    }
+
+    /**
+     * Gets the download end time.
+     *
+     * @return Download end time from System.currentTimeMillis().
+     */
+    public long getEndTime() {
+        return mEndTime;
+    }
+
+    /**
      * Sets whether the file associated with this item has been removed through an external
      * action.
      *
@@ -139,15 +158,17 @@
     public static OfflineItem createOfflineItem(DownloadItem item) {
         OfflineItem offlineItem = DownloadInfo.createOfflineItem(item.getDownloadInfo());
         offlineItem.creationTimeMs = item.getStartTime();
+        offlineItem.completionTimeMs = item.getEndTime();
         offlineItem.externallyRemoved = item.hasBeenExternallyRemoved();
         return offlineItem;
     }
 
     @CalledByNative
-    private static DownloadItem createDownloadItem(
-            DownloadInfo downloadInfo, long startTimestamp, boolean hasBeenExternallyRemoved) {
+    private static DownloadItem createDownloadItem(DownloadInfo downloadInfo, long startTimestamp,
+            long endTimestamp, boolean hasBeenExternallyRemoved) {
         DownloadItem downloadItem = new DownloadItem(false, downloadInfo);
         downloadItem.setStartTime(startTimestamp);
+        downloadItem.setEndTime(endTimestamp);
         downloadItem.setHasBeenExternallyRemoved(hasBeenExternallyRemoved);
         return downloadItem;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/JustNowProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/JustNowProvider.java
new file mode 100644
index 0000000..c27bec8
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/JustNowProvider.java
@@ -0,0 +1,33 @@
+// Copyright 2018 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.
+
+package org.chromium.chrome.browser.download.home;
+
+import org.chromium.components.offline_items_collection.OfflineItem;
+import org.chromium.components.offline_items_collection.OfflineItemState;
+
+import java.util.Date;
+
+/** Helper class to expose whether an item should be shown in the Just Now section. */
+public class JustNowProvider {
+    // Threshold time interval during which a download is considered recent.
+    private static final long JUST_NOW_DEFAULT_THRESHOLD_MS = 30 * 60 * 1000;
+
+    // Threshold timestamp after which a download is considered recent.
+    private final Date mThresholdDate;
+
+    /** Constructor. */
+    public JustNowProvider() {
+        mThresholdDate = new Date(new Date().getTime() - JUST_NOW_DEFAULT_THRESHOLD_MS);
+    }
+
+    /**
+     * @return Whether the given {@code item} should be shown in the Just Now section.
+     */
+    public boolean isJustNowItem(OfflineItem item) {
+        return item.state == OfflineItemState.IN_PROGRESS || item.state == OfflineItemState.PAUSED
+                || (item.state == OfflineItemState.INTERRUPTED && item.isResumable)
+                || new Date(item.completionTimeMs).after(mThresholdDate);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/StableIds.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/StableIds.java
new file mode 100644
index 0000000..1d7b9c36
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/StableIds.java
@@ -0,0 +1,17 @@
+// Copyright 2018 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.
+
+package org.chromium.chrome.browser.download.home;
+
+/** Helper class to manage stable ID for items in the recycler view. */
+public class StableIds {
+    /** The stable ID associated with the storage header. */
+    public static long STORAGE_HEADER = Long.MAX_VALUE - 1;
+
+    /** The stable ID associated with the filters row. */
+    public static long FILTERS_HEADER = Long.MAX_VALUE - 2;
+
+    /** The stable ID associated with the Just Now section. */
+    public static long JUST_NOW_SECTION = Long.MAX_VALUE - 3;
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java
index 043ec2ef..d8062a59 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java
@@ -12,6 +12,7 @@
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.browser.download.home.PrefetchStatusProvider;
+import org.chromium.chrome.browser.download.home.StableIds;
 import org.chromium.chrome.browser.download.home.empty.EmptyCoordinator;
 import org.chromium.chrome.browser.download.home.filter.FilterCoordinator;
 import org.chromium.chrome.browser.download.home.filter.Filters.FilterType;
@@ -111,9 +112,9 @@
         mFilterCoordinator.addObserver(mEmptyCoordinator);
 
         decoratedModel.addHeader(
-                new ViewListItem(Long.MAX_VALUE - 1L, mStorageCoordinator.getView()));
+                new ViewListItem(StableIds.STORAGE_HEADER, mStorageCoordinator.getView()));
         decoratedModel.addHeader(
-                new ViewListItem(Long.MAX_VALUE - 2L, mFilterCoordinator.getView()));
+                new ViewListItem(StableIds.FILTERS_HEADER, mFilterCoordinator.getView()));
         initializeView(context);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
index 5cd286bf..966accb8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
@@ -13,6 +13,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.ChromeApplication;
+import org.chromium.chrome.browser.download.home.JustNowProvider;
 import org.chromium.chrome.browser.download.home.OfflineItemSource;
 import org.chromium.chrome.browser.download.home.filter.DeleteUndoOfflineItemFilter;
 import org.chromium.chrome.browser.download.home.filter.Filters.FilterType;
@@ -142,7 +143,7 @@
         mDeleteUndoFilter = new DeleteUndoOfflineItemFilter(mInvalidStateFilter);
         mTypeFilter = new TypeOfflineItemFilter(mDeleteUndoFilter);
         mSearchFilter = new SearchOfflineItemFilter(mTypeFilter);
-        mListMutator = new DateOrderedListMutator(mSearchFilter, mModel);
+        mListMutator = new DateOrderedListMutator(mSearchFilter, mModel, new JustNowProvider());
 
         mSearchFilter.addObserver(new EmptyStateObserver(mSearchFilter, dateOrderedListObserver));
         mThumbnailProvider = new ThumbnailProviderImpl(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java
index d6d1eaf..b03dcab 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java
@@ -5,12 +5,14 @@
 package org.chromium.chrome.browser.download.home.list;
 
 import org.chromium.base.CollectionUtil;
+import org.chromium.chrome.browser.download.home.JustNowProvider;
 import org.chromium.chrome.browser.download.home.filter.Filters;
 import org.chromium.chrome.browser.download.home.filter.OfflineItemFilterObserver;
 import org.chromium.chrome.browser.download.home.filter.OfflineItemFilterSource;
 import org.chromium.chrome.browser.download.home.list.ListItem.OfflineItemListItem;
 import org.chromium.chrome.browser.download.home.list.ListItem.SectionHeaderListItem;
 import org.chromium.chrome.browser.download.home.list.ListItem.SeparatorViewListItem;
+import org.chromium.components.offline_items_collection.ContentId;
 import org.chromium.components.offline_items_collection.OfflineItem;
 import org.chromium.components.offline_items_collection.OfflineItemFilter;
 
@@ -35,6 +37,8 @@
  *   for an example since that is close to doing what we want - minus the contains() call).
  */
 class DateOrderedListMutator implements OfflineItemFilterObserver {
+    private static final Date JUST_NOW_DATE = new Date(Long.MAX_VALUE);
+    private final JustNowProvider mJustNowProvider;
     private final ListItemModel mModel;
 
     private final Map<Date, DateGroup> mDateGroups =
@@ -48,8 +52,10 @@
      * @param source The source of data for this list.
      * @param model  The model that will be the storage for the updated list.
      */
-    public DateOrderedListMutator(OfflineItemFilterSource source, ListItemModel model) {
+    public DateOrderedListMutator(
+            OfflineItemFilterSource source, ListItemModel model, JustNowProvider justNowProvider) {
         mModel = model;
+        mJustNowProvider = justNowProvider;
         source.addObserver(this);
         onItemsAdded(source.getItems());
     }
@@ -67,7 +73,7 @@
     @Override
     public void onItemsAdded(Collection<OfflineItem> items) {
         for (OfflineItem item : items) {
-            Date date = getDateFromOfflineItem(item);
+            Date date = getSectionDateFromOfflineItem(item);
             DateGroup dateGroup = mDateGroups.get(date);
             if (dateGroup == null) {
                 dateGroup = new DateGroup();
@@ -82,7 +88,7 @@
     @Override
     public void onItemsRemoved(Collection<OfflineItem> items) {
         for (OfflineItem item : items) {
-            Date date = getDateFromOfflineItem(item);
+            Date date = getSectionDateFromOfflineItem(item);
             DateGroup dateGroup = mDateGroups.get(date);
             if (dateGroup == null) continue;
 
@@ -101,7 +107,8 @@
 
         // If the update changed the creation time or filter type, remove and add the element to get
         // it positioned.
-        if (oldItem.creationTimeMs != item.creationTimeMs || oldItem.filter != item.filter) {
+        if (oldItem.creationTimeMs != item.creationTimeMs || oldItem.filter != item.filter
+                || shouldShowInJustNowSection(oldItem) != shouldShowInJustNowSection((item))) {
             // TODO(shaktisahu): Collect UMA when this happens.
             onItemsRemoved(CollectionUtil.newArrayList(oldItem));
             onItemsAdded(CollectionUtil.newArrayList(item));
@@ -151,9 +158,8 @@
 
                 // Add a section header.
                 if (!mHideAllHeaders) {
-                    SectionHeaderListItem sectionHeaderItem =
-                            new SectionHeaderListItem(filter, date.getTime());
-                    sectionHeaderItem.showDate = sectionIndex == 0;
+                    SectionHeaderListItem sectionHeaderItem = new SectionHeaderListItem(
+                            filter, date.getTime(), sectionIndex == 0, date.equals(JUST_NOW_DATE));
                     sectionHeaderItem.showTitle = !mHideSectionHeaders;
                     sectionHeaderItem.showMenu = filter == OfflineItemFilter.FILTER_IMAGE;
                     sectionHeaderItem.items = new ArrayList<>(section.items.values());
@@ -188,8 +194,19 @@
         mModel.dispatchLastEvent();
     }
 
-    private Date getDateFromOfflineItem(OfflineItem offlineItem) {
-        return CalendarUtils.getStartOfDay(offlineItem.creationTimeMs).getTime();
+    private Date getSectionDateFromOfflineItem(OfflineItem offlineItem) {
+        return shouldShowInJustNowSection(offlineItem)
+                ? JUST_NOW_DATE
+                : CalendarUtils.getStartOfDay(offlineItem.creationTimeMs).getTime();
+    }
+
+    private boolean isShowingInJustNowSection(OfflineItem item) {
+        DateGroup justNowGroup = mDateGroups.get(JUST_NOW_DATE);
+        return justNowGroup != null && justNowGroup.contains(item.id);
+    }
+
+    private boolean shouldShowInJustNowSection(OfflineItem item) {
+        return mJustNowProvider.isJustNowItem(item) || isShowingInJustNowSection(item);
     }
 
     /** Represents a group of items which were downloaded on the same day. */
@@ -220,6 +237,15 @@
                 sections.remove(item.filter);
             }
         }
+
+        public boolean contains(ContentId id) {
+            for (Section section : sections.values()) {
+                for (OfflineItem item : section.items.values()) {
+                    if (item.id.equals(id)) return true;
+                }
+            }
+            return false;
+        }
     }
 
     /** Represents a group of items having the same filter type. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java
index 11ee72f..2d5d198b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java
@@ -7,6 +7,7 @@
 import android.view.View;
 
 import org.chromium.base.VisibleForTesting;
+import org.chromium.chrome.browser.download.home.StableIds;
 import org.chromium.components.offline_items_collection.OfflineItem;
 
 import java.util.Calendar;
@@ -77,15 +78,21 @@
         public boolean showDate;
         public boolean showTitle;
         public boolean showMenu;
+        public boolean isJustNow;
         public List<OfflineItem> items;
 
         /**
          * Creates a {@link SectionHeaderListItem} instance for a given {@code filter} and
          * {@code timestamp}.
          */
-        public SectionHeaderListItem(int filter, long timestamp) {
-            super(generateStableId(timestamp, filter), new Date(timestamp));
+        public SectionHeaderListItem(
+                int filter, long timestamp, boolean showDate, boolean isJustNow) {
+            super(isJustNow && showDate ? StableIds.JUST_NOW_SECTION
+                                        : generateStableId(timestamp, filter),
+                    new Date(timestamp));
             this.filter = filter;
+            this.showDate = showDate;
+            this.isJustNow = isJustNow;
         }
 
         @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java
index e9a16e07..09caf93 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java
@@ -69,7 +69,9 @@
         mTitle.setText(ListUtils.getTextForSection(sectionItem.filter));
 
         if (sectionItem.showDate) {
-            mDate.setText(UiUtils.dateToHeaderString(sectionItem.date));
+            mDate.setText(sectionItem.isJustNow ? itemView.getContext().getResources().getString(
+                                                          R.string.download_manager_just_now)
+                                                : UiUtils.dateToHeaderString(sectionItem.date));
         }
 
         updateTopBottomSpacing(sectionItem.showMenu);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java
index 36ea1ca9..597ed75 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java
@@ -20,6 +20,8 @@
  */
 public class ExploreSitesTileView extends TileWithTextView {
     private final int mIconSizePx;
+
+    // Used to generate textual icons.
     private RoundedIconGenerator mIconGenerator;
 
     public ExploreSitesTileView(Context ctx, AttributeSet attrs) {
@@ -39,6 +41,7 @@
         if (image == null) {
             return new BitmapDrawable(getResources(), mIconGenerator.generateIconForText(text));
         }
-        return ViewUtils.createRoundedBitmapDrawable(image, mIconSizePx / 2);
+        return ViewUtils.createRoundedBitmapDrawable(
+                image, ViewUtils.DEFAULT_FAVICON_CORNER_RADIUS);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java
index c2aa451..a3ca386e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java
@@ -13,6 +13,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.ui.UiUtils;
 import org.chromium.ui.base.WindowAndroid;
@@ -136,7 +137,7 @@
         if (!currentTab.isUserInteractable()) return true;
         // If the tab focused and not showing Android widget based content, then use the Compositor
         // based screenshot.
-        if (currentTab.getNativePage() == null && !currentTab.isShowingSadTab()) return true;
+        if (currentTab.getNativePage() == null && !SadTab.isShowing(currentTab)) return true;
 
         // Assume the UI is drawn primarily by Android widgets, so do not use the Compositor
         // screenshot.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
index b99928f..db1c16e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
@@ -331,7 +331,7 @@
         }
 
         @Override
-        public void onCrash(Tab tab, boolean sadTabShown) {
+        public void onCrash(Tab tab) {
             dismissActivity(mActivity, METRICS_END_REASON_CRASH);
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java
index 612958ca..4ae37b50 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java
@@ -133,9 +133,7 @@
             case KnownCategories.DOWNLOADS:
                 navigationDelegate.navigateToDownloadManager();
                 break;
-            case KnownCategories.FOREIGN_TABS:
-                navigationDelegate.navigateToRecentTabs();
-                break;
+            case KnownCategories.FOREIGN_TABS_DEPRECATED:
             case KnownCategories.PHYSICAL_WEB_PAGES_DEPRECATED:
             case KnownCategories.RECENT_TABS_DEPRECATED:
             case KnownCategories.ARTICLES:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index 323c931..4b4ba28 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -30,6 +30,7 @@
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
@@ -282,7 +283,7 @@
      */
     private static boolean shouldSkipSavingTabOffline(Tab tab) {
         WebContents webContents = tab.getWebContents();
-        return tab.isShowingErrorPage() || tab.isShowingSadTab() || webContents == null
+        return tab.isShowingErrorPage() || SadTab.isShowing(tab) || webContents == null
                 || webContents.isDestroyed() || webContents.isIncognito();
     }
 
@@ -870,7 +871,7 @@
          * If the tab was being restored, reports that it crashed while doing so.
          */
         @Override
-        public void onCrash(Tab tab, boolean sadTabShown) {
+        public void onCrash(Tab tab) {
             if (tab.isBeingRestored()) recordTabRestoreHistogram(TabRestoreType.CRASHED, null);
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java
index 800de6d6..459a058 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java
@@ -16,6 +16,7 @@
 import org.chromium.chrome.browser.feature_engagement.ScreenshotTabObserver;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
 import org.chromium.chrome.browser.printing.PrintShareActivity;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.util.ChromeFileProvider;
 import org.chromium.components.ui_metrics.CanonicalURLResult;
@@ -90,7 +91,7 @@
         String url = currentTab.getUrl();
         if (TextUtils.isEmpty(url)) return false;
         if (currentTab.isShowingErrorPage() || currentTab.isShowingInterstitialPage()
-                || currentTab.isShowingSadTab()) {
+                || SadTab.isShowing(currentTab)) {
             return false;
         }
         return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java
index 676b3cf41..3a65508 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java
@@ -71,7 +71,7 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
+            public void onCrash(Tab tab) {
                 AutoSigninSnackbarController.this.dismissAutoSigninSnackbar();
             }
         };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java
index 7cf2731..e66451e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsEventReporterBridge.java
@@ -61,10 +61,6 @@
             case KnownCategories.BOOKMARKS:
                 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_BOOKMARKS_MANAGER);
                 break;
-            // MORE button leads to the recent tabs manager
-            case KnownCategories.FOREIGN_TABS:
-                NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_RECENT_TABS_MANAGER);
-                break;
             case KnownCategories.DOWNLOADS:
                 NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_DOWNLOADS_MANAGER);
                 break;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
index 09b09df..efd2ce5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
@@ -8,7 +8,6 @@
 import org.chromium.blink_public.web.WebReferrerPolicy;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.UrlConstants;
 import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
 import org.chromium.chrome.browser.download.DownloadMetrics;
 import org.chromium.chrome.browser.download.DownloadUtils;
@@ -45,12 +44,6 @@
         BookmarkUtils.showBookmarkManager(mActivity);
     }
 
-    /** Opens the recent tabs page in the current tab. */
-    public void navigateToRecentTabs() {
-        RecordUserAction.record("MobileNTPSwitchToOpenTabs");
-        mHost.loadUrl(new LoadUrlParams(UrlConstants.RECENT_TABS_URL), /* incognito = */ false);
-    }
-
     /** Opens the Download Manager UI in the current tab. */
     public void navigateToDownloadManager() {
         RecordUserAction.record("MobileNTPSwitchToDownloadManager");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
index 2c28ce1..9c732090 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -64,7 +64,7 @@
     public void onSSLStateUpdated(Tab tab) { }
 
     @Override
-    public void onCrash(Tab tab, boolean sadTabShown) { }
+    public void onCrash(Tab tab) {}
 
     @Override
     public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) { }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTab.java
index 3aa1d277..0505a075 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTab.java
@@ -64,6 +64,7 @@
     }
 
     public static boolean isShowing(Tab tab) {
+        if (tab == null || !tab.isInitialized()) return false;
         SadTab sadTab = get(tab);
         return sadTab != null ? sadTab.isShowing() : false;
     }
@@ -124,7 +125,7 @@
      * Removes the sad tab view if present.
      */
     @VisibleForTesting
-    void removeIfPresent() {
+    public void removeIfPresent() {
         if (isShowing()) {
             mTab.getContentView().removeView(mView);
             mTab.notifyContentChanged();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
index 9d882b9..8e83b92 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -1877,13 +1877,6 @@
     }
 
     /**
-     * @return Whether or not the sad tab is showing.
-     */
-    public boolean isShowingSadTab() {
-        return mIsInitialized ? SadTab.isShowing(this) : false;
-    }
-
-    /**
      * Calls onContentChanged on all TabObservers and updates accessibility visibility.
      */
     void notifyContentChanged() {
@@ -2668,9 +2661,8 @@
     void handleTabCrash() {
         mIsLoading = false;
 
-        boolean sadTabShown = isShowingSadTab();
         RewindableIterator<TabObserver> observers = getTabObservers();
-        while (observers.hasNext()) observers.next().onCrash(this, sadTabShown);
+        while (observers.hasNext()) observers.next().onCrash(this);
         mIsBeingRestored = false;
     }
 
@@ -2927,8 +2919,8 @@
 
         WebContentsAccessibility wcax = getWebContentsAccessibility(getWebContents());
         if (wcax != null) {
-            boolean isWebContentObscured = isObscuredByAnotherViewForAccessibility()
-                    || isShowingSadTab();
+            boolean isWebContentObscured =
+                    isObscuredByAnotherViewForAccessibility() || SadTab.isShowing(this);
             wcax.setObscuredByAnotherView(isWebContentObscured);
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java
index 14dfc41..4a4979ec 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java
@@ -77,8 +77,8 @@
         mTab = tab;
         mTabObserver = new EmptyTabObserver() {
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
-                if (sadTabShown) showAndroidControls(false);
+            public void onCrash(Tab tab) {
+                if (SadTab.isShowing(tab)) showAndroidControls(false);
             }
             @Override
             public void onRendererResponsiveStateChanged(boolean isResponsive) {
@@ -141,7 +141,7 @@
         if (!Float.isNaN(contentOffsetY)) mPreviousContentOffsetY = contentOffsetY;
 
         if (mTab.getFullscreenManager() == null) return;
-        if (mTab.isShowingSadTab() || mTab.isNativePage()) {
+        if (SadTab.isShowing(mTab) || mTab.isNativePage()) {
             showAndroidControls(false);
         } else {
             updateFullscreenManagerOffsets(false, mPreviousTopControlsOffsetY,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
index 65b8af8..4c575cc5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -125,9 +125,8 @@
     /**
      * Called when the ContentView of a {@link Tab} crashes.
      * @param tab The notifying {@link Tab}.
-     * @param sadTabShown Whether or not the sad tab was shown
      */
-    void onCrash(Tab tab, boolean sadTabShown);
+    void onCrash(Tab tab);
 
     /**
      * Called when restore of the corresponding tab is triggered.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
index 6a42d31..8648e81c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
@@ -414,7 +414,7 @@
 
     /** Called when the renderer of the correspoding tab crashes. */
     @Override
-    public void onCrash(Tab tab, boolean sadTabShown) {
+    public void onCrash(Tab tab) {
         if (mRestoreStartedAtMillis != -1) {
             // TODO(ppi): Add a bucket in Tab.RestoreResult for restores failed due to
             //            renderer crashes and start to track that.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
index 9f0c5f5..b689894 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -116,7 +116,7 @@
             // a new renderer for the shared RenderProcessHost and the new renderer crashes
             // again, all tabs sharing this renderer will be notified about the crash (including
             // potential background tabs that did not reload yet).
-            if (mTab.needsReload() || mTab.isShowingSadTab()) return;
+            if (mTab.needsReload() || SadTab.isShowing(mTab)) return;
 
             // This will replace TabRendererCrashStatus if numbers line up.
             int appState = ApplicationStatus.getStateForApplication();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
index be9ed550..e450114 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -10,6 +10,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.Tab.TabHidingType;
 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
@@ -190,10 +191,8 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
-                if (sadTabShown) {
-                    mTabContentManager.removeTabThumbnail(tab.getId());
-                }
+            public void onCrash(Tab tab) {
+                if (SadTab.isShowing(tab)) mTabContentManager.removeTabThumbnail(tab.getId());
                 mUma.onTabCrashed(tab.getId());
             }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index b8b93e80..9f8d5bc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -74,6 +74,7 @@
 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
 import org.chromium.chrome.browser.search_engines.TemplateUrlService.TemplateUrlServiceObserver;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
@@ -390,7 +391,7 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
+            public void onCrash(Tab tab) {
                 updateTabLoadingState(false);
                 updateButtonStatus();
                 finishLoadProgress(false);
@@ -1521,7 +1522,7 @@
     private void updateButtonStatus() {
         assert mToolbar != null;
         Tab currentTab = mToolbarModel.getTab();
-        boolean tabCrashed = currentTab != null && currentTab.isShowingSadTab();
+        boolean tabCrashed = currentTab != null && SadTab.isShowing(currentTab);
 
         mToolbar.updateButtonVisibility();
         mToolbar.updateBackButtonVisibility(currentTab != null && currentTab.canGoBack());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShell.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShell.java
index 9deaa31..10d2148 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShell.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrShell.java
@@ -252,7 +252,7 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
+            public void onCrash(Tab tab) {
                 updateHistoryButtonsVisibility();
             }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java
index c7b61a9..acc075a2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java
@@ -158,7 +158,7 @@
     }
 
     @Override
-    public void onCrash(Tab tab, boolean sadTabShown) {
+    public void onCrash(Tab tab) {
         animateHidingSplashScreen(tab, WebappUma.SplashScreenHidesReason.CRASH);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java
index 988c452..93fe539 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java
@@ -112,7 +112,7 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
+            public void onCrash(Tab tab) {
                 clearRequestsAndHide();
             }
 
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 269d740..37a5b95 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -2530,6 +2530,9 @@
       <message name="IDS_DOWNLOAD_MANAGER_IN_PROGRESS_DESCRIPTION" desc="Text containing two components of an in-progress string description.">
         <ph name="FILE_SIZE_OF_TOTAL">%1$s<ex>1.56 MB / 10MB</ex></ph> <ph name="SEPARATOR">•</ph> <ph name="DESCRIPTION">%2$s<ex>failed</ex></ph>
       </message>
+      <message name="IDS_DOWNLOAD_MANAGER_JUST_NOW" desc="Text on a label describing that the associated download event happened just now.">
+        Just Now
+      </message>
 
       <!-- Browsing History UI -->
       <message name="IDS_HISTORY_MANAGER_EMPTY" desc="Indicates that there are no browsing history items.">
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 039ba8e..c5bd8060 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -475,8 +475,10 @@
   "java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinator.java",
   "java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorFactory.java",
   "java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java",
+  "java/src/org/chromium/chrome/browser/download/home/JustNowProvider.java",
   "java/src/org/chromium/chrome/browser/download/home/OfflineItemSource.java",
   "java/src/org/chromium/chrome/browser/download/home/PrefetchStatusProvider.java",
+  "java/src/org/chromium/chrome/browser/download/home/StableIds.java",
   "java/src/org/chromium/chrome/browser/download/home/UmaUtils.java",
   "java/src/org/chromium/chrome/browser/download/home/empty/EmptyCoordinator.java",
   "java/src/org/chromium/chrome/browser/download/home/empty/EmptyProperties.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java
index d9c9c83..df2523fe 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java
@@ -250,7 +250,7 @@
             }
 
             @Override
-            public void onCrash(Tab tab, boolean sadTabShown) {
+            public void onCrash(Tab tab) {
                 crashedCallback.notifyCalled();
             }
         });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
index a9a5854..d28daebf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
@@ -20,6 +20,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType;
@@ -53,7 +54,7 @@
     };
 
     private boolean isShowingSadTab() throws Exception {
-        return ThreadUtils.runOnUiThreadBlocking(() -> mTab.isShowingSadTab());
+        return ThreadUtils.runOnUiThreadBlocking(() -> SadTab.isShowing(mTab));
     }
 
     @Before
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java
index 1a762c2..90fa23e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedRefreshTaskTest.java
@@ -13,8 +13,10 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.CommandLine;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
@@ -30,7 +32,8 @@
  * Unit tests for {@link FeedSchedulerBridge}.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.Add(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE)
+//@Features.EnableFeatures(ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS)
 public class FeedRefreshTaskTest {
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
@@ -69,6 +72,13 @@
 
     @Before
     public void setUp() throws InterruptedException {
+        // TODO(https://crbug.com/894334): Replace with @Features.EnableFeatures when presubmit
+        // forced format is fixed.
+        CommandLine commandLine = CommandLine.getInstance();
+        String oldValue = commandLine.getSwitchValue("enable-features");
+        commandLine.appendSwitchWithValue("enable-features",
+                oldValue + "," + ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS);
+
         mTaskScheduler = new TestBackgroundTaskScheduler();
         BackgroundTaskSchedulerFactory.setSchedulerForTesting(mTaskScheduler);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
index 5b15ed1..4903342 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarTest.java
@@ -33,6 +33,7 @@
 import org.chromium.chrome.browser.WebContentsFactory;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.preferences.datareduction.DataReductionPromoUtils;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.InfoBarTestAnimationListener;
@@ -587,7 +588,7 @@
         CriteriaHelper.pollUiThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
-                return mActivityTestRule.getActivity().getActivityTab().isShowingSadTab();
+                return SadTab.isShowing(mActivityTestRule.getActivity().getActivityTab());
             }
         }, MAX_TIMEOUT, CHECK_INTERVAL);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareMenuActionHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareMenuActionHandlerTest.java
index b6bf122..d3cf48aa 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareMenuActionHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareMenuActionHandlerTest.java
@@ -15,6 +15,7 @@
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.test.ChromeBrowserTestRule;
+import org.chromium.chrome.test.util.SadTabRule;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.test.mock.MockRenderFrameHost;
 import org.chromium.content_public.browser.test.mock.MockWebContents;
@@ -29,12 +30,16 @@
     @Rule
     public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule();
 
+    @Rule
+    public final SadTabRule mSadTabRule = new SadTabRule();
+
     @Test
     @SmallTest
     public void testShouldFetchCanonicalUrl() throws ExecutionException {
         MockTab mockTab = ThreadUtils.runOnUiThreadBlocking(() -> { return new MockTab(); });
         MockWebContents mockWebContents = new MockWebContents();
         MockRenderFrameHost mockRenderFrameHost = new MockRenderFrameHost();
+        mSadTabRule.setTab(mockTab);
 
         // Null webContents:
         Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab));
@@ -58,9 +63,9 @@
         mockTab.isShowingInterstitialPage = false;
 
         // Disabled if showing sad tab page.
-        mockTab.isShowingSadTab = true;
+        mSadTabRule.show(true);
         Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab));
-        mockTab.isShowingSadTab = false;
+        mSadTabRule.show(false);
     }
 
     @Test
@@ -99,7 +104,6 @@
         public String url;
         public boolean isShowingErrorPage;
         public boolean isShowingInterstitialPage;
-        public boolean isShowingSadTab;
 
         public MockTab() {
             super(INVALID_TAB_ID, false, null);
@@ -124,10 +128,5 @@
         public boolean isShowingInterstitialPage() {
             return isShowingInterstitialPage;
         }
-
-        @Override
-        public boolean isShowingSadTab() {
-            return isShowingSadTab;
-        }
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java
index 31e7e3bf..93e6599 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java
@@ -46,7 +46,7 @@
 
     private static boolean isShowingSadTab(Tab tab) {
         try {
-            return ThreadUtils.runOnUiThreadBlocking(() -> tab.isShowingSadTab());
+            return ThreadUtils.runOnUiThreadBlocking(() -> SadTab.isShowing(tab));
         } catch (ExecutionException e) {
             return false;
         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
index eb485d0..0433244 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
@@ -4,8 +4,11 @@
 
 package org.chromium.chrome.browser.tab;
 
+import android.view.View;
+
 import org.chromium.base.ObserverList;
 import org.chromium.base.ObserverList.RewindableIterator;
+import org.chromium.base.ThreadUtils;
 
 /**
  * Exposes helper functions to be used in tests to instrument tab interaction.
@@ -53,8 +56,28 @@
      * @param sadTabShown Whether the sad tab was shown.
      */
     public static void simulateCrash(Tab tab, boolean sadTabShown) {
+        setupSadTab(tab, sadTabShown);
         RewindableIterator<TabObserver> observers = tab.getTabObservers();
-        while (observers.hasNext()) observers.next().onCrash(tab, sadTabShown);
+        while (observers.hasNext()) observers.next().onCrash(tab);
+    }
+
+    private static void setupSadTab(Tab tab, boolean show) {
+        boolean isShowing = SadTab.isShowing(tab);
+        if (!show && isShowing) {
+            SadTab.get(tab).removeIfPresent();
+        } else if (show && !isShowing) {
+            SadTab sadTab = new SadTab(tab) {
+                @Override
+                public View createView(Runnable suggestionAction, Runnable buttonAction,
+                        boolean showSendFeedbackView, boolean isIncognito) {
+                    return new View(tab.getThemedApplicationContext());
+                }
+            };
+            ThreadUtils.runOnUiThreadBlocking(() -> {
+                SadTab.initForTesting(tab, sadTab);
+                sadTab.show();
+            });
+        }
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java
index e97274c5..ab5038b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java
@@ -13,6 +13,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.UrlConstants;
+import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
@@ -532,6 +533,6 @@
                 () -> ChromeTabUtils.simulateRendererKilledForTesting(tab, true));
 
         CriteriaHelper.pollUiThread(
-                () -> { return tab.isShowingSadTab(); }, "Renderer killed, but sad tab not shown");
+                () -> SadTab.isShowing(tab), "Renderer killed, but sad tab not shown");
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
index b98a78b..3174c38 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
@@ -21,6 +21,8 @@
 
 import org.chromium.base.CollectionUtil;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.download.home.JustNowProvider;
+import org.chromium.chrome.browser.download.home.StableIds;
 import org.chromium.chrome.browser.download.home.filter.OfflineItemFilterSource;
 import org.chromium.chrome.browser.download.home.list.ListItem.OfflineItemListItem;
 import org.chromium.chrome.browser.download.home.list.ListItem.SectionHeaderListItem;
@@ -28,6 +30,7 @@
 import org.chromium.chrome.browser.modelutil.ListObservable.ListObserver;
 import org.chromium.components.offline_items_collection.OfflineItem;
 import org.chromium.components.offline_items_collection.OfflineItemFilter;
+import org.chromium.components.offline_items_collection.OfflineItemState;
 
 import java.util.Calendar;
 import java.util.Collections;
@@ -65,7 +68,7 @@
     @Test
     public void testNoItemsAndSetup() {
         when(mSource.getItems()).thenReturn(Collections.emptySet());
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         verify(mSource, times(1)).addObserver(list);
 
         Assert.assertEquals(0, mModel.size());
@@ -82,7 +85,7 @@
         OfflineItem item1 =
                 buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(2, mModel.size());
         assertSectionHeader(
@@ -104,7 +107,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(3, mModel.size());
         assertSectionHeader(
@@ -129,7 +132,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_AUDIO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(5, mModel.size());
         assertSectionHeader(
@@ -157,7 +160,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_IMAGE);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(5, mModel.size());
         assertSectionHeader(
@@ -188,7 +191,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_PAGE);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(5, mModel.size());
         assertSectionHeader(
@@ -205,6 +208,145 @@
 
     /**
      * Action                               List
+     * 1. Set(item1 @ 1:00 1/1/2018         [ DATE    Just Now,
+     *        IN_PROGRESS)                    SECTION @ Video,
+     *                                        item1   @ 1:00 1/1/2018 ]
+     */
+    @Test
+    public void testSingleItemInJustNowSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
+        item1.state = OfflineItemState.IN_PROGRESS;
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
+        DateOrderedListMutator list = createMutatorWithJustNowProvider();
+
+        Assert.assertEquals(2, mModel.size());
+        assertJustNowSection(mModel.get(0), OfflineItemFilter.FILTER_VIDEO, true);
+        assertOfflineItem(mModel.get(1), buildCalendar(2018, 1, 1, 1), item1);
+    }
+
+    /**
+     * Action                               List
+     * 1. Set(item1 @ 1:00 1/1/2018         [ DATE    Just Now,
+     *              Video IN_PROGRESS,        SECTION @ Video,
+     *        item2 @ 1:00 1/1/2018           item1   @ 1:00 1/1/2018,
+     *              Audio COMPLETE Recent)    -----------------------
+     *                                        SECTION @ Audio,
+     *                                        item2   @ 1:00 1/1/2018 ]
+     */
+    @Test
+    public void testMultipleSectionsInJustNowSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_AUDIO);
+        item1.state = OfflineItemState.IN_PROGRESS;
+        item2.state = OfflineItemState.IN_PROGRESS;
+        item2.completionTimeMs = item2.creationTimeMs;
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
+        DateOrderedListMutator list = createMutatorWithJustNowProvider();
+
+        Assert.assertEquals(5, mModel.size());
+        assertJustNowSection(mModel.get(0), OfflineItemFilter.FILTER_VIDEO, true);
+        assertOfflineItem(mModel.get(1), buildCalendar(2018, 1, 1, 1), item1);
+        assertJustNowSection(mModel.get(3), OfflineItemFilter.FILTER_AUDIO, false);
+        assertOfflineItem(mModel.get(4), buildCalendar(2018, 1, 1, 1), item2);
+    }
+
+    /**
+     * Action                               List
+     * 1. Set(item1 @ 1:00 1/1/2018         [ DATE    Just Now,
+     *        PAUSED)                         SECTION @ Video,
+     *                                        item1   @ 1:00 1/1/2018 ]
+     * 2. Update(item1 @ 1:00 1/1/2018      [ DATE    Just Now,
+     *        Resume --> IN_PROGRESS)         SECTION @ Video,
+     *                                        item1   @ 1:00 1/1/2018 ]
+     * 3. Update(item1 @ 1:00 1/1/2018      [ DATE    Just Now,
+     *       COMPLETE, completion time now)   SECTION @ Video,
+     *                                        item1   @ 1:00 1/1/2018 ]
+     * 4. Update(item1 @ 1:00 1/1/2018      [ DATE    Just Now,
+     *    COMPLETE, completion time 1/1/2017) SECTION @ Video,
+     *                                        item1   @ 1:00 1/1/2018 ]
+     */
+    @Test
+    public void testItemDoesNotMoveOutOfJustNowSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
+        item1.state = OfflineItemState.PAUSED;
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
+        DateOrderedListMutator list = createMutatorWithJustNowProvider();
+        mModel.addObserver(mObserver);
+
+        Assert.assertEquals(2, mModel.size());
+        assertJustNowSection(mModel.get(0), OfflineItemFilter.FILTER_VIDEO, true);
+        assertOfflineItem(mModel.get(1), buildCalendar(2018, 1, 1, 1), item1);
+
+        // Resume the download.
+        OfflineItem update1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
+        update1.state = OfflineItemState.IN_PROGRESS;
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(update1));
+        list.onItemUpdated(item1, update1);
+
+        Assert.assertEquals(2, mModel.size());
+        assertJustNowSection(mModel.get(0), OfflineItemFilter.FILTER_VIDEO, true);
+        assertOfflineItem(mModel.get(1), buildCalendar(2018, 1, 1, 1), update1);
+
+        // Complete the download.
+        OfflineItem update2 =
+                buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
+        update2.state = OfflineItemState.COMPLETE;
+        update2.completionTimeMs = update2.creationTimeMs;
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(update2));
+        list.onItemUpdated(update1, update2);
+
+        Assert.assertEquals(2, mModel.size());
+        assertJustNowSection(mModel.get(0), OfflineItemFilter.FILTER_VIDEO, true);
+        assertOfflineItem(mModel.get(1), buildCalendar(2018, 1, 1, 1), update2);
+
+        // Too much time has passed since completion of the download.
+        OfflineItem update3 =
+                buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
+        update3.state = OfflineItemState.COMPLETE;
+        update3.completionTimeMs = buildCalendar(2017, 1, 1, 1).getTimeInMillis();
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(update3));
+        list.onItemUpdated(update2, update3);
+
+        Assert.assertEquals(2, mModel.size());
+        assertJustNowSection(mModel.get(0), OfflineItemFilter.FILTER_VIDEO, true);
+        assertOfflineItem(mModel.get(1), buildCalendar(2018, 1, 1, 1), update3);
+    }
+
+    /**
+     * Action                               List
+     * 1. Set(item1 @ 1:00 2/1/2018         [ DATE    Just Now,
+     *              Video IN_PROGRESS,        SECTION @ Video,
+     *        item2 @ 1:00 1/1/2018           item1   @ 1:00 2/1/2018,
+     *              Audio COMPLETE)      -----------------------
+     *                                        DATE    1/1/2018
+     *                                        SECTION @ Audio,
+     *                                        item2   @ 1:00 1/1/2018 ]
+     */
+    @Test
+    public void testJustNowSectionWithOtherDates() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 2, 1, 1), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_AUDIO);
+        item1.state = OfflineItemState.IN_PROGRESS;
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
+        DateOrderedListMutator list = createMutatorWithJustNowProvider();
+
+        Assert.assertEquals(5, mModel.size());
+        assertJustNowSection(mModel.get(0), OfflineItemFilter.FILTER_VIDEO, true);
+        assertOfflineItem(mModel.get(1), buildCalendar(2018, 2, 1, 1), item1);
+        assertSectionHeader(
+                mModel.get(3), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_AUDIO, true);
+        assertOfflineItem(mModel.get(4), buildCalendar(2018, 1, 1, 1), item2);
+    }
+
+    /**
+     * Action                               List
      * 1. Set(item1 @ 0:00 1/2/2018,        [ DATE    @ 0:00 1/2/2018,
      *        item2 @ 0:00 1/1/2018)          SECTION @ Video,
      *                                        item1   @ 0:00 1/2/2018,
@@ -220,7 +362,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_AUDIO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(5, mModel.size());
         assertSectionHeader(
@@ -246,7 +388,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(3, mModel.size());
         assertSectionHeader(
@@ -272,7 +414,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(5, mModel.size());
         assertSectionHeader(
@@ -301,7 +443,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_PAGE);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(5, mModel.size());
         assertSectionHeader(
@@ -328,7 +470,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 2, 3), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
 
         Assert.assertEquals(5, mModel.size());
         assertSectionHeader(
@@ -350,7 +492,7 @@
     @Test
     public void testAddItemToEmptyList() {
         when(mSource.getItems()).thenReturn(Collections.emptySet());
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         OfflineItem item1 =
@@ -385,7 +527,7 @@
         OfflineItem item1 =
                 buildItem("1", buildCalendar(2018, 1, 2, 1), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         // Add an item on the same day that will be placed first.
@@ -436,7 +578,7 @@
         OfflineItem item1 =
                 buildItem("1", buildCalendar(2018, 1, 2, 4), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         // Add an item on the same day that will be placed last.
@@ -475,7 +617,7 @@
         OfflineItem item1 =
                 buildItem("1", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         when(mSource.getItems()).thenReturn(Collections.emptySet());
@@ -502,7 +644,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item2));
@@ -532,7 +674,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
@@ -564,7 +706,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_IMAGE);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
         Assert.assertEquals(5, mModel.size());
 
@@ -598,7 +740,7 @@
         OfflineItem item2 =
                 buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
@@ -627,7 +769,7 @@
     @Test
     public void testAddMultipleItems() {
         when(mSource.getItems()).thenReturn(Collections.emptySet());
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         OfflineItem item1 =
@@ -684,7 +826,7 @@
 
         when(mSource.getItems())
                 .thenReturn(CollectionUtil.newArrayList(item1, item2, item3, item4));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
@@ -713,7 +855,7 @@
                 buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         // Update an item with the same timestamp.
@@ -748,7 +890,7 @@
                 buildItem("2", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         // Update an item with the same timestamp.
@@ -786,7 +928,7 @@
                 buildItem("2", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         // Update an item with the same timestamp.
@@ -821,7 +963,7 @@
                 buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        DateOrderedListMutator list = createMutatorWithoutJustNowProvider();
         mModel.addObserver(mObserver);
 
         // Update an item with the same timestamp.
@@ -852,6 +994,19 @@
         return item;
     }
 
+    private DateOrderedListMutator createMutatorWithoutJustNowProvider() {
+        return new DateOrderedListMutator(mSource, mModel, new JustNowProvider() {
+            @Override
+            public boolean isJustNowItem(OfflineItem item) {
+                return false;
+            }
+        });
+    }
+
+    private DateOrderedListMutator createMutatorWithJustNowProvider() {
+        return new DateOrderedListMutator(mSource, mModel, new JustNowProvider());
+    }
+
     private static void assertDatesAreEqual(Date date, Calendar calendar) {
         Calendar calendar2 = CalendarFactory.get();
         calendar2.setTime(date);
@@ -878,6 +1033,22 @@
         Assert.assertEquals(sectionHeader.showDate, showDate);
     }
 
+    private static void assertJustNowSection(
+            ListItem item, @OfflineItemFilter int filter, boolean showDate) {
+        Assert.assertTrue(item instanceof SectionHeaderListItem);
+        SectionHeaderListItem sectionHeader = (SectionHeaderListItem) item;
+        Assert.assertEquals(filter, sectionHeader.filter);
+        Assert.assertTrue(sectionHeader.isJustNow);
+        Assert.assertEquals(sectionHeader.showDate, showDate);
+        if (showDate) {
+            Assert.assertEquals(StableIds.JUST_NOW_SECTION, item.stableId);
+        } else {
+            Assert.assertEquals(SectionHeaderListItem.generateStableId(
+                                        new Date(Long.MAX_VALUE).getTime(), filter),
+                    item.stableId);
+        }
+    }
+
     private static void assertSeparator(ListItem item, Calendar calendar, boolean isDateDivider) {
         Assert.assertTrue(item instanceof SeparatorViewListItem);
         assertDatesAreEqual(((SeparatorViewListItem) item).date, calendar);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java
index 772a0f2..034ade3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsUnitTest.java
@@ -17,6 +17,7 @@
 import android.os.Environment;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -26,10 +27,13 @@
 import org.robolectric.annotation.Implements;
 import org.robolectric.shadows.multidex.ShadowMultiDex;
 
+import org.chromium.base.UserDataHost;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabObserver;
+import org.chromium.chrome.test.util.SadTabRule;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkType;
 import org.chromium.content_public.browser.WebContents;
@@ -54,6 +58,9 @@
     @Mock
     private OfflinePageUtils.Internal mOfflinePageUtils;
 
+    @Rule
+    public final SadTabRule mSadTabRule = new SadTabRule();
+
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -62,7 +69,10 @@
         // Setting up a mock tab. These are the values common to most tests, but individual
         // tests might easily overwrite them.
         doReturn(false).when(mTab).isShowingErrorPage();
-        doReturn(false).when(mTab).isShowingSadTab();
+        doReturn(new UserDataHost()).when(mTab).getUserDataHost();
+        doReturn(true).when(mTab).isInitialized();
+        mSadTabRule.setTab(mTab);
+        doNothing().when(mTab).addObserver(any(TabObserver.class));
         doReturn(mWebContents).when(mTab).getWebContents();
         doReturn(false).when(mWebContents).isDestroyed();
         doReturn(false).when(mWebContents).isIncognito();
@@ -152,14 +162,14 @@
                         any(OfflinePageBridge.SavePageCallback.class));
 
         doReturn(false).when(mTab).isShowingErrorPage();
-        doReturn(true).when(mTab).isShowingSadTab();
+        mSadTabRule.show(true);
         OfflinePageUtils.saveBookmarkOffline(bookmarkId, mTab);
         // Save page not called because tab is showing a sad tab.
         verify(mOfflinePageBridge, times(0))
                 .savePage(eq(mWebContents), any(ClientId.class),
                         any(OfflinePageBridge.SavePageCallback.class));
 
-        doReturn(false).when(mTab).isShowingSadTab();
+        mSadTabRule.show(false);
         doReturn(null).when(mTab).getWebContents();
         OfflinePageUtils.saveBookmarkOffline(bookmarkId, mTab);
         // Save page not called because tab returns null web contents.
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index f86508e..45b4b73 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-71.0.3576.0_rc-r1.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-71.0.3577.0_rc-r1.afdo.bz2
\ No newline at end of file
diff --git a/chrome/android/webapk/shell_apk/AndroidManifest.xml b/chrome/android/webapk/shell_apk/AndroidManifest.xml
index a353907..9e39611 100644
--- a/chrome/android/webapk/shell_apk/AndroidManifest.xml
+++ b/chrome/android/webapk/shell_apk/AndroidManifest.xml
@@ -21,13 +21,9 @@
         android:label="@string/short_name"
         android:allowBackup="false"
         android:supportsRtl="true">
-        <activity android:name="org.chromium.webapk.shell_apk.MainActivity"
+        <activity android:name="org.chromium.webapk.shell_apk.TransparentHostBrowserLauncherActivity"
                   android:theme="@android:style/Theme.Translucent.NoTitleBar"
                   android:excludeFromRecents="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
             {{#intent_filters}}
             <intent-filter>
                 <action android:name="android.intent.action.VIEW"></action>
@@ -37,14 +33,41 @@
             </intent-filter>
             {{/intent_filters}}
             {{{raw_intent_filters}}}
+         </activity>
+
+        {{#use_new_splash}}
+        <activity android:name="org.chromium.webapk.shell_apk.h2o.SplashActivity"
+                  android:theme="@style/SplashTheme"
+                  android:enabled="false">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
         </activity>
-        <activity android:name="org.chromium.webapk.shell_apk.ShareActivity"
+        <activity android:name="org.chromium.webapk.shell_apk.h2o.H2OMainActivity"
                   android:theme="@android:style/Theme.Translucent.NoTitleBar"
-                  android:excludeFromRecents="true"/>
+                  android:excludeFromRecents="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        {{/use_new_splash}}
+        {{^use_new_splash}}
+        <activity android:name="org.chromium.webapk.shell_apk.MainActivity"
+                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
+                  android:excludeFromRecents="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        {{/use_new_splash}}
+
         {{#share_template}}
         <activity-alias android:name="org.chromium.webapk.shell_apk.ShareActivity{{{index}}}"
                   android:label="{{{title}}}"
-                  android:targetActivity="org.chromium.webapk.shell_apk.ShareActivity">
+                  android:targetActivity="org.chromium.webapk.shell_apk.TransparentHostBrowserLauncherActivity">
           <meta-data android:name="org.chromium.webapk.shell_apk.shareAction" android:value="{{{action}}}" />
           <meta-data android:name="org.chromium.webapk.shell_apk.shareParamTitle" android:value="{{{param_title}}}" />
           <meta-data android:name="org.chromium.webapk.shell_apk.shareParamText" android:value="{{{param_text}}}" />
diff --git a/chrome/android/webapk/shell_apk/BUILD.gn b/chrome/android/webapk/shell_apk/BUILD.gn
index bcf1c6e..ed1f4f1 100644
--- a/chrome/android/webapk/shell_apk/BUILD.gn
+++ b/chrome/android/webapk/shell_apk/BUILD.gn
@@ -41,9 +41,8 @@
       "src/org/chromium/webapk/shell_apk/HostBrowserUtils.java",
       "src/org/chromium/webapk/shell_apk/IdentityService.java",
       "src/org/chromium/webapk/shell_apk/InstallHostBrowserDialog.java",
-      "src/org/chromium/webapk/shell_apk/MainActivity.java",
       "src/org/chromium/webapk/shell_apk/LaunchHostBrowserSelector.java",
-      "src/org/chromium/webapk/shell_apk/ShareActivity.java",
+      "src/org/chromium/webapk/shell_apk/TransparentHostBrowserLauncherActivity.java",
       "src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java",
       "src/org/chromium/webapk/shell_apk/WebApkServiceImplWrapper.java",
       "src/org/chromium/webapk/shell_apk/WebApkUtils.java",
@@ -55,9 +54,14 @@
     ]
 
     if (invoker.use_new_splash) {
-      java_files +=
-          [ "src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java" ]
+      java_files += [
+        "src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java",
+        "src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java",
+        "src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java",
+      ]
       deps += [ "//chrome/android/webapk/libs/common:splash_java" ]
+    } else {
+      java_files += [ "src/org/chromium/webapk/shell_apk/MainActivity.java" ]
     }
   }
 }
@@ -77,14 +81,13 @@
   manifest_processor_template(_manifest_target_name) {
     forward_variables_from(invoker, [ "config_file" ])
 
-    if (_use_new_splash) {
-      input = "h2o/AndroidManifest.xml"
-    } else {
-      input = "AndroidManifest.xml"
-    }
+    input = "AndroidManifest.xml"
     output = _manifest_output
 
-    extra_variables = [ "shell_apk_version=$current_shell_apk_version" ]
+    extra_variables = [
+      "shell_apk_version=$current_shell_apk_version",
+      "use_new_splash=$_use_new_splash",
+    ]
   }
 
   android_resources(_resources_target_name) {
diff --git a/chrome/android/webapk/shell_apk/h2o/AndroidManifest.xml b/chrome/android/webapk/shell_apk/h2o/AndroidManifest.xml
deleted file mode 100644
index 50015cb9..0000000
--- a/chrome/android/webapk/shell_apk/h2o/AndroidManifest.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="{{{manifest_package}}}"
-    android:versionCode="{{{version_code}}}"
-    android:versionName="{{{version_name}}}" >
-
-    <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
-
-    <uses-sdk
-        android:minSdkVersion="16"
-        android:targetSdkVersion="26" />
-
-    <application
-        android:icon="@mipmap/ic_launcher"
-        android:label="@string/short_name"
-        android:allowBackup="false"
-        android:supportsRtl="true">
-        <activity android:name="org.chromium.webapk.shell_apk.h2o.SplashActivity"
-                  android:theme="@style/SplashTheme">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <meta-data android:name="org.chromium.webapk.shell_apk.shellApkVersion" android:value="{{{shell_apk_version}}}" />
-        {{#bound_webapk}}
-        <meta-data android:name="org.chromium.webapk.shell_apk.runtimeHost" android:value="{{{runtime_host}}}" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.runtimeHostApplicationName" android:value="{{{runtime_host_application_name}}}" />
-        {{/bound_webapk}}
-        <meta-data android:name="org.chromium.webapk.shell_apk.startUrl" android:value="{{{start_url}}}" />
-        {{#logged_intent_url_param}}
-        <meta-data android:name="org.chromium.webapk.shell_apk.loggedIntentUrlParam" android:value="{{{logged_intent_url_param}}}" />
-        {{/logged_intent_url_param}}
-        <meta-data android:name="org.chromium.webapk.shell_apk.scope" android:value="{{{scope_url}}}" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.displayMode" android:value="{{{display_mode}}}" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.orientation" android:value="{{{orientation}}}" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.themeColor" android:value="{{{theme_color}}}" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.backgroundColor" android:value="{{{background_color}}}" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.hasLargeSplashIcons" android:value="{{{has_large_splash_icons}}}" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.iconId" android:resource="@mipmap/app_icon" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.splashId" android:resource="@drawable/splash_icon" />
-        <meta-data android:name="org.chromium.webapk.shell_apk.distributor" android:value="{{{distributor}}}" />
-
-        {{!  Hashes of icons should be taken of the icons as they are available on the web. The icon
-             bytes should not be transformed (e.g. decoded / encoded) prior to taking the hash.
-        }}
-        <meta-data android:name="org.chromium.webapk.shell_apk.iconUrlsAndIconMurmur2Hashes" android:value="{{{icon_urls_and_icon_murmur2_hashes}}}" />
-
-        <meta-data android:name="org.chromium.webapk.shell_apk.webManifestUrl" android:value="{{{web_manifest_url}}}" />
-        {{#badge_icon_id}}<meta-data android:name="org.chromium.webapk.shell_apk.badgeIconId" android:resource="{{{badge_icon_id}}}" />{{/badge_icon_id}}
-    </application>
-</manifest>
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java
index bbc75b4..dbb8ec7 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java
@@ -9,9 +9,9 @@
 import android.os.SystemClock;
 
 /**
- * UI-less activity which launches host browser.
+ * Base class for activity which launches host browser.
  */
-public class HostBrowserLauncherActivity extends Activity {
+public abstract class HostBrowserLauncherActivity extends Activity {
     private long mActivityStartTimeMs;
 
     @Override
@@ -19,25 +19,28 @@
         mActivityStartTimeMs = SystemClock.elapsedRealtime();
         super.onCreate(savedInstanceState);
 
+        showSplashScreen();
+
         new LaunchHostBrowserSelector(this).selectHostBrowser(
                 new LaunchHostBrowserSelector.Callback() {
                     @Override
                     public void onBrowserSelected(
                             String hostBrowserPackageName, boolean dialogShown) {
-                        launchHostBrowser(hostBrowserPackageName, dialogShown);
-                        finish();
+                        if (hostBrowserPackageName == null) {
+                            finish();
+                            return;
+                        }
+                        HostBrowserLauncherParams params =
+                                HostBrowserLauncherParams.createForIntent(
+                                        HostBrowserLauncherActivity.this, getComponentName(),
+                                        getIntent(), hostBrowserPackageName, dialogShown,
+                                        mActivityStartTimeMs);
+                        onHostBrowserSelected(params);
                     }
                 });
     }
 
-    private void launchHostBrowser(String hostBrowserPackageName, boolean dialogShown) {
-        if (hostBrowserPackageName == null) return;
+    protected abstract void showSplashScreen();
 
-        HostBrowserLauncherParams params =
-                HostBrowserLauncherParams.createForIntent(this, getComponentName(), getIntent(),
-                        hostBrowserPackageName, dialogShown, mActivityStartTimeMs);
-        if (params == null) return;
-
-        HostBrowserLauncher.launch(getApplicationContext(), params);
-    }
+    protected abstract void onHostBrowserSelected(HostBrowserLauncherParams params);
 }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java
index d4b96d0..840d815e 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java
@@ -7,4 +7,4 @@
 /**
  * WebAPK's main Activity.
  */
-public class MainActivity extends HostBrowserLauncherActivity {}
+public class MainActivity extends TransparentHostBrowserLauncherActivity {}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ShareActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ShareActivity.java
deleted file mode 100644
index e51dd864..0000000
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/ShareActivity.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 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.
-
-package org.chromium.webapk.shell_apk;
-
-/**
- * WebAPK's share handler Activity.
- */
-public class ShareActivity extends HostBrowserLauncherActivity {}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/TransparentHostBrowserLauncherActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/TransparentHostBrowserLauncherActivity.java
new file mode 100644
index 0000000..720cfb3
--- /dev/null
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/TransparentHostBrowserLauncherActivity.java
@@ -0,0 +1,23 @@
+// Copyright 2018 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.
+
+package org.chromium.webapk.shell_apk;
+
+/**
+ * UI-less activity which launches host browser.
+ */
+public class TransparentHostBrowserLauncherActivity extends HostBrowserLauncherActivity {
+    @Override
+    protected void showSplashScreen() {}
+
+    @Override
+    protected void onHostBrowserSelected(HostBrowserLauncherParams params) {
+        if (params == null) {
+            finish();
+            return;
+        }
+        HostBrowserLauncher.launch(getApplicationContext(), params);
+        finish();
+    }
+}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java
new file mode 100644
index 0000000..99fdd866
--- /dev/null
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java
@@ -0,0 +1,45 @@
+// Copyright 2018 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.
+
+package org.chromium.webapk.shell_apk.h2o;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+
+import org.chromium.webapk.shell_apk.HostBrowserLauncherParams;
+
+/** Contains methods for launching host browser where ShellAPK shows the splash screen. */
+public class H2OLauncher {
+    // Lowest version of Chromium which supports ShellAPK showing the splash screen.
+    private static final int MINIMUM_REQUIRED_CHROMIUM_VERSION_NEW_SPLASH = Integer.MAX_VALUE;
+
+    /**
+     * Returns whether the main intent should launch SplashActivity.class for the given host browser
+     * params.
+     */
+    public static boolean shouldMainIntentLaunchSplashActivity(HostBrowserLauncherParams params) {
+        return params.getHostBrowserMajorChromiumVersion()
+                >= MINIMUM_REQUIRED_CHROMIUM_VERSION_NEW_SPLASH
+                && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
+    }
+
+    /**
+     * Changes which components are enabled.
+     *
+     * @param context
+     * @param enableComponent Component to enable.
+     * @param disableComponent Component to disable.
+     */
+    public static void changeEnabledComponentsAndKillShellApk(
+            Context context, ComponentName enableComponent, ComponentName disableComponent) {
+        PackageManager pm = context.getPackageManager();
+        // The state change takes seconds if we do not let PackageManager kill the ShellAPK.
+        pm.setComponentEnabledSetting(enableComponent,
+                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
+        pm.setComponentEnabledSetting(
+                disableComponent, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
+    }
+}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java
new file mode 100644
index 0000000..e373fa1
--- /dev/null
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java
@@ -0,0 +1,36 @@
+// Copyright 2018 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.
+
+package org.chromium.webapk.shell_apk.h2o;
+
+import android.content.ComponentName;
+import android.content.Context;
+
+import org.chromium.webapk.shell_apk.HostBrowserLauncher;
+import org.chromium.webapk.shell_apk.HostBrowserLauncherParams;
+import org.chromium.webapk.shell_apk.TransparentHostBrowserLauncherActivity;
+
+/**
+ * Handles android.intent.action.MAIN intents if the host browser does not support "showing a
+ * transparent window in WebAPK mode till the URL has been loaded".
+ */
+public class H2OMainActivity extends TransparentHostBrowserLauncherActivity {
+    @Override
+    protected void onHostBrowserSelected(HostBrowserLauncherParams params) {
+        if (params == null) {
+            finish();
+            return;
+        }
+
+        Context appContext = getApplicationContext();
+        HostBrowserLauncher.launch(appContext, params);
+
+        if (H2OLauncher.shouldMainIntentLaunchSplashActivity(params)) {
+            H2OLauncher.changeEnabledComponentsAndKillShellApk(appContext,
+                    new ComponentName(appContext, SplashActivity.class), getComponentName());
+        }
+
+        finish();
+    }
+}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
index 659566c..da1be3e 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
@@ -4,7 +4,8 @@
 
 package org.chromium.webapk.shell_apk.h2o;
 
-import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Color;
@@ -14,18 +15,16 @@
 import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
 import org.chromium.webapk.lib.common.WebApkMetaDataUtils;
 import org.chromium.webapk.lib.common.splash.SplashLayout;
+import org.chromium.webapk.shell_apk.HostBrowserLauncher;
+import org.chromium.webapk.shell_apk.HostBrowserLauncherActivity;
+import org.chromium.webapk.shell_apk.HostBrowserLauncherParams;
 import org.chromium.webapk.shell_apk.R;
 import org.chromium.webapk.shell_apk.WebApkUtils;
 
 /** Displays splash screen. */
-public class SplashActivity extends Activity {
+public class SplashActivity extends HostBrowserLauncherActivity {
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView();
-    }
-
-    private void setContentView() {
+    protected void showSplashScreen() {
         Bundle metadata = WebApkUtils.readMetaData(this);
         Resources resources = getResources();
 
@@ -46,4 +45,24 @@
         WebApkUtils.setStatusBarColor(
                 getWindow(), WebApkUtils.getDarkenedColorForStatusBar(themeColor));
     }
+
+    @Override
+    protected void onHostBrowserSelected(HostBrowserLauncherParams params) {
+        if (params == null) {
+            finish();
+            return;
+        }
+
+        Context appContext = getApplicationContext();
+
+        // TODO(pkotwicz): Pass parameter to tell Chrome not to show splash screen.
+        HostBrowserLauncher.launch(appContext, params);
+
+        if (!H2OLauncher.shouldMainIntentLaunchSplashActivity(params)) {
+            H2OLauncher.changeEnabledComponentsAndKillShellApk(appContext,
+                    new ComponentName(appContext, H2OMainActivity.class), getComponentName());
+            finish();
+            return;
+        }
+    }
 }
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index ba1e3e1..395f713 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -73,7 +73,7 @@
 #include "base/debug/close_handle_hook_win.h"
 #include "base/win/atl.h"
 #include "chrome/browser/downgrade/user_data_downgrade.h"
-#include "chrome/child/v8_breakpad_support_win.h"
+#include "chrome/child/v8_crashpad_support_win.h"
 #include "chrome/common/child_process_logging.h"
 #include "chrome_elf/chrome_elf_main.h"
 #include "sandbox/win/src/sandbox.h"
@@ -555,7 +555,7 @@
       base::PlatformThread::CurrentId());
 
 #if defined(OS_WIN) && !defined(CHROME_MULTIPLE_DLL_BROWSER)
-  v8_breakpad_support::SetUp();
+  v8_crashpad_support::SetUp();
 #endif
 #if defined(OS_LINUX)
   breakpad::SetFirstChanceExceptionHandler(v8::V8::TryHandleSignal);
diff --git a/chrome/browser/android/download/download_manager_service.cc b/chrome/browser/android/download/download_manager_service.cc
index cfebd8f..ac8b45e 100644
--- a/chrome/browser/android/download/download_manager_service.cc
+++ b/chrome/browser/android/download/download_manager_service.cc
@@ -61,7 +61,8 @@
   DCHECK(!item->IsTransient());
   return Java_DownloadItem_createDownloadItem(
       env, DownloadManagerService::CreateJavaDownloadInfo(env, item),
-      item->GetStartTime().ToJavaTime(), item->GetFileExternallyRemoved());
+      item->GetStartTime().ToJavaTime(), item->GetEndTime().ToJavaTime(),
+      item->GetFileExternallyRemoved());
 }
 
 class ServiceImpl : public service_manager::Service {
diff --git a/chrome/browser/android/feed/feed_offline_bridge.cc b/chrome/browser/android/feed/feed_offline_bridge.cc
index b259377..68a55404 100644
--- a/chrome/browser/android/feed/feed_offline_bridge.cc
+++ b/chrome/browser/android/feed/feed_offline_bridge.cc
@@ -57,6 +57,9 @@
       offline_host_(offline_host),
       weak_factory_(this) {
   DCHECK(offline_host_);
+  // The host guarantees to not invoke these callbacks until Initialize() exits.
+  // This is important because until the Java bridge's constructor finishes, any
+  // attempt to cross JNI from native to Java will fail.
   offline_host_->Initialize(
       base::BindRepeating(&FeedOfflineBridge::TriggerGetKnownContent,
                           weak_factory_.GetWeakPtr()),
@@ -122,14 +125,26 @@
     const base::android::JavaRef<jstring>& j_favicon_url,
     const base::android::JavaRef<jstring>& j_snippet) {
   ContentMetadata metadata;
+  DCHECK(!j_url.is_null());
   metadata.url = base::android::ConvertJavaStringToUTF8(env, j_url);
+  DCHECK(!j_title.is_null());
   metadata.title = base::android::ConvertJavaStringToUTF8(env, j_title);
   metadata.time_published = base::Time::FromJavaTime(j_time_published_ms);
-  metadata.image_url = base::android::ConvertJavaStringToUTF8(env, j_image_url);
-  metadata.publisher = base::android::ConvertJavaStringToUTF8(env, j_publisher);
-  metadata.favicon_url =
-      base::android::ConvertJavaStringToUTF8(env, j_favicon_url);
-  metadata.snippet = base::android::ConvertJavaStringToUTF8(env, j_snippet);
+  if (!j_image_url.is_null()) {
+    metadata.image_url =
+        base::android::ConvertJavaStringToUTF8(env, j_image_url);
+  }
+  if (!j_publisher.is_null()) {
+    metadata.publisher =
+        base::android::ConvertJavaStringToUTF8(env, j_publisher);
+  }
+  if (!j_favicon_url.is_null()) {
+    metadata.favicon_url =
+        base::android::ConvertJavaStringToUTF8(env, j_favicon_url);
+  }
+  if (!j_snippet.is_null()) {
+    metadata.snippet = base::android::ConvertJavaStringToUTF8(env, j_snippet);
+  }
   known_content_metadata_buffer_.push_back(std::move(metadata));
 }
 
diff --git a/chrome/browser/android/password_manager/password_accessory_view_android.cc b/chrome/browser/android/password_manager/password_accessory_view_android.cc
index 424a322..44d412f 100644
--- a/chrome/browser/android/password_manager/password_accessory_view_android.cc
+++ b/chrome/browser/android/password_manager/password_accessory_view_android.cc
@@ -87,8 +87,10 @@
 void PasswordAccessoryViewAndroid::OnFaviconRequested(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& obj,
+    jint desiredSizeInPx,
     const base::android::JavaParamRef<jobject>& j_callback) {
   controller_->GetFavicon(
+      desiredSizeInPx,
       base::BindOnce(&PasswordAccessoryViewAndroid::OnImageFetched,
                      base::Unretained(this),  // Outlives or cancels request.
                      base::android::ScopedJavaGlobalRef<jobject>(j_callback)));
diff --git a/chrome/browser/android/password_manager/password_accessory_view_android.h b/chrome/browser/android/password_manager/password_accessory_view_android.h
index 3d0d2f9..1499613 100644
--- a/chrome/browser/android/password_manager/password_accessory_view_android.h
+++ b/chrome/browser/android/password_manager/password_accessory_view_android.h
@@ -36,6 +36,7 @@
   void OnFaviconRequested(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
+      jint desiredSizeInPx,
       const base::android::JavaParamRef<jobject>& j_callback);
   void OnFillingTriggered(
       JNIEnv* env,
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
index ffca78a..98a1e23 100644
--- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
+++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -159,9 +159,23 @@
 
   ui::InputMethod* GetInputMethod() override { return input_method_; }
 
+  void SendKeyEvent(ui::KeyEvent* event) override {
+    ui::MockIMEInputContextHandler::SendKeyEvent(event);
+    ++send_key_event_call_count_;
+  }
+
+  void Reset() {
+    ui::MockIMEInputContextHandler::Reset();
+    send_key_event_call_count_ = 0;
+  }
+
+  int send_key_event_call_count() const { return send_key_event_call_count_; }
+
  private:
   ui::InputMethod* const input_method_;
 
+  int send_key_event_call_count_ = 0;
+
   DISALLOW_COPY_AND_ASSIGN(TestIMEInputContextHandler);
 };
 
@@ -757,6 +771,13 @@
   EXPECT_EQ(1, bridge()->update_text_input_state_calls_count_);
   EXPECT_TRUE(bridge()->last_text_input_state->first_update_after_operation);
 
+  // Calling CommitText() with '\n' doesn't invoke
+  // InputMethodEngine::CommitText.
+  EXPECT_EQ(0, test_context_handler.send_key_event_call_count());
+  connection->CommitText(base::ASCIIToUTF16("\n"), 0);
+  EXPECT_EQ(1, test_context_handler.commit_text_call_count());
+  EXPECT_EQ(2, test_context_handler.send_key_event_call_count());
+
   test_context_handler.Reset();
   connection->DeleteSurroundingText(1, 1);
   EXPECT_EQ(1, test_context_handler.delete_surrounding_text_call_count());
diff --git a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc
index 6adb189..280e86a 100644
--- a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc
+++ b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc
@@ -4,9 +4,12 @@
 
 #include "chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h"
 
+#include <tuple>
+
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/base/ime/ime_bridge.h"
+#include "ui/events/keycodes/keyboard_codes.h"
 
 namespace arc {
 
@@ -20,6 +23,22 @@
 // send the current text input state right after the IME operation completion.
 constexpr base::TimeDelta kStateUpdateTimeout = base::TimeDelta::FromSeconds(1);
 
+// Characters which should be sent as a KeyEvent and attributes of generated
+// KeyEvent.
+constexpr std::tuple<char, ui::KeyboardCode, const char*>
+    kControlCharToKeyEvent[] = {{'\n', ui::VKEY_RETURN, "Enter"}};
+
+bool IsControlChar(const base::string16& text) {
+  const std::string str = base::UTF16ToUTF8(text);
+  if (str.length() != 1)
+    return false;
+  for (const auto& t : kControlCharToKeyEvent) {
+    if (str[0] == std::get<0>(t))
+      return true;
+  }
+  return false;
+}
+
 }  // namespace
 
 InputConnectionImpl::InputConnectionImpl(
@@ -80,6 +99,12 @@
   // Clear the current composing text at first.
   if (!ime_engine_->ClearComposition(input_context_id_, &error))
     LOG(ERROR) << "ClearComposition failed: error=\"" << error << "\"";
+
+  if (IsControlChar(text)) {
+    SendControlKeyEvent(text);
+    return;
+  }
+
   if (!ime_engine_->CommitText(input_context_id_,
                                base::UTF16ToUTF8(text).c_str(), &error))
     LOG(ERROR) << "CommitText failed: error=\"" << error << "\"";
@@ -164,4 +189,25 @@
                      true /* is_input_state_update_requested */));
 }
 
+void InputConnectionImpl::SendControlKeyEvent(const base::string16& text) {
+  DCHECK(IsControlChar(text));
+
+  const std::string str = base::UTF16ToUTF8(text);
+  DCHECK_EQ(1u, str.length());
+
+  for (const auto& t : kControlCharToKeyEvent) {
+    if (std::get<0>(t) == str[0]) {
+      chromeos::InputMethodEngine::KeyboardEvent press;
+      press.type = "keydown";
+      press.key_code = std::get<1>(t);
+      press.key = press.code = std::get<2>(t);
+      chromeos::InputMethodEngine::KeyboardEvent release(press);
+      release.type = "keyup";
+      ime_engine_->SendKeyEvents(input_context_id_, {press, release});
+      break;
+    }
+  }
+  return;
+}
+
 }  // namespace arc
diff --git a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h
index 4152590..ac3f65d0 100644
--- a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h
+++ b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h
@@ -55,6 +55,8 @@
   // starting timer is after API call, the timer won't be cancelled.
   void StartStateUpdateTimer();
 
+  void SendControlKeyEvent(const base::string16& text);
+
   chromeos::InputMethodEngine* const ime_engine_;  // Not owned
   ArcInputMethodManagerBridge* const imm_bridge_;  // Not owned
   const int input_context_id_;
diff --git a/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc b/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc
index e9e3531..bb8758b70 100644
--- a/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc
+++ b/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc
@@ -86,7 +86,8 @@
           policy::DeviceStatusCollector::CPUStatisticsFetcher(),
           policy::DeviceStatusCollector::CPUTempFetcher(),
           policy::DeviceStatusCollector::AndroidStatusFetcher(),
-          day_reset_time_, false /* is_enterprise_reporting */),
+          policy::DeviceStatusCollector::TpmStatusFetcher(), day_reset_time_,
+          false /* is_enterprise_reporting */),
       base::ThreadTaskRunnerHandle::Get(), kStatusUploadFrequency);
 }
 
diff --git a/chrome/browser/chromeos/drive/drive_integration_service.cc b/chrome/browser/chromeos/drive/drive_integration_service.cc
index 9bf86b6..aa00ac7 100644
--- a/chrome/browser/chromeos/drive/drive_integration_service.cc
+++ b/chrome/browser/chromeos/drive/drive_integration_service.cc
@@ -15,6 +15,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/md5.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
 #include "base/task/post_task.h"
@@ -344,6 +345,27 @@
   return pinned_files;
 }
 
+void UmaEmitMountOutcome(DriveMountStatus status,
+                         const base::TimeTicks& time_started) {
+  UMA_HISTOGRAM_ENUMERATION("DriveCommon.Lifecycle.Mount", status);
+  if (status == DriveMountStatus::kSuccess) {
+    UMA_HISTOGRAM_TIMES("DriveCommon.Lifecycle.MountTime.SuccessTime",
+                        base::TimeTicks::Now() - time_started);
+  } else {
+    UMA_HISTOGRAM_TIMES("DriveCommon.Lifecycle.MountTime.FailTime",
+                        base::TimeTicks::Now() - time_started);
+  }
+}
+
+void UmaEmitUnmountOutcome(DriveMountStatus status) {
+  UMA_HISTOGRAM_ENUMERATION("DriveCommon.Lifecycle.Unmount", status);
+}
+
+void UmaEmitFirstLaunch(const base::TimeTicks& time_started) {
+  UMA_HISTOGRAM_TIMES("DriveCommon.Lifecycle.FirstLaunchTime",
+                      base::TimeTicks::Now() - time_started);
+}
+
 }  // namespace
 
 // Observes drive disable Preference's change.
@@ -427,22 +449,20 @@
 };
 
 class DriveIntegrationService::DriveFsHolder
-    : public drivefs::DriveFsHost::Delegate {
+    : public drivefs::DriveFsHost::Delegate,
+      public drivefs::DriveFsHost::MountObserver {
  public:
-  DriveFsHolder(
-      Profile* profile,
-      base::RepeatingClosure on_drivefs_mounted,
-      base::RepeatingCallback<void(base::Optional<base::TimeDelta>,
-                                   bool failed_to_mount)> on_drivefs_unmounted,
-      DriveFsMojoConnectionDelegateFactory
-          test_drivefs_mojo_connection_delegate_factory)
+  DriveFsHolder(Profile* profile,
+                drivefs::DriveFsHost::MountObserver* mount_observer,
+                DriveFsMojoConnectionDelegateFactory
+                    test_drivefs_mojo_connection_delegate_factory)
       : profile_(profile),
-        on_drivefs_mounted_(std::move(on_drivefs_mounted)),
-        on_drivefs_unmounted_(std::move(on_drivefs_unmounted)),
+        mount_observer_(mount_observer),
         test_drivefs_mojo_connection_delegate_factory_(
             std::move(test_drivefs_mojo_connection_delegate_factory)),
         drivefs_host_(profile_->GetPath(),
                       this,
+                      this,
                       std::make_unique<base::OneShotTimer>()) {}
 
   drivefs::DriveFsHost* drivefs_host() { return &drivefs_host_; }
@@ -470,15 +490,15 @@
   }
 
   void OnMountFailed(base::Optional<base::TimeDelta> remount_delay) override {
-    on_drivefs_unmounted_.Run(std::move(remount_delay), true);
+    mount_observer_->OnMountFailed(remount_delay);
   }
 
   void OnMounted(const base::FilePath& path) override {
-    on_drivefs_mounted_.Run();
+    mount_observer_->OnMounted(path);
   }
 
   void OnUnmounted(base::Optional<base::TimeDelta> remount_delay) override {
-    on_drivefs_unmounted_.Run(std::move(remount_delay), false);
+    mount_observer_->OnUnmounted(remount_delay);
   }
 
   const std::string& GetProfileSalt() {
@@ -502,12 +522,7 @@
   }
 
   Profile* const profile_;
-
-  // Invoked when DriveFS mounting is completed.
-  const base::RepeatingClosure on_drivefs_mounted_;
-  const base::RepeatingCallback<void(base::Optional<base::TimeDelta>,
-                                     bool failed_to_mount)>
-      on_drivefs_unmounted_;
+  drivefs::DriveFsHost::MountObserver* const mount_observer_;
 
   const DriveFsMojoConnectionDelegateFactory
       test_drivefs_mojo_connection_delegate_factory_;
@@ -565,12 +580,7 @@
           base::FeatureList::IsEnabled(chromeos::features::kDriveFs)
               ? std::make_unique<DriveFsHolder>(
                     profile_,
-                    base::BindRepeating(&DriveIntegrationService::
-                                            AddDriveMountPointAfterMounted,
-                                        base::Unretained(this)),
-                    base::BindRepeating(
-                        &DriveIntegrationService::MaybeRemountFileSystem,
-                        base::Unretained(this)),
+                    this,
                     std::move(test_drivefs_mojo_connection_delegate_factory))
               : nullptr),
       weak_ptr_factory_(this) {
@@ -855,16 +865,23 @@
   weak_ptr_factory_.InvalidateWeakPtrs();
 
   if (drivefs_holder_ && !drivefs_holder_->drivefs_host()->IsMounted()) {
+    PrefService* prefs = profile_->GetPrefs();
+    bool was_ever_mounted =
+        prefs->GetBoolean(prefs::kDriveFsWasLaunchedAtLeastOnce);
+    if (mount_start_.is_null() || was_ever_mounted) {
+      mount_start_ = base::TimeTicks::Now();
+    }
     drivefs_holder_->drivefs_host()->Mount();
-    return;
+  } else {
+    AddDriveMountPointAfterMounted();
   }
-  AddDriveMountPointAfterMounted();
 }
 
-void DriveIntegrationService::AddDriveMountPointAfterMounted() {
+bool DriveIntegrationService::AddDriveMountPointAfterMounted() {
   const base::FilePath& drive_mount_point = GetMountPointPath();
-  if (mount_point_name_.empty())
+  if (mount_point_name_.empty()) {
     mount_point_name_ = drive_mount_point.BaseName().AsUTF8Unsafe();
+  }
   storage::ExternalMountPoints* const mount_points =
       storage::ExternalMountPoints::GetSystemInstance();
   DCHECK(mount_points);
@@ -889,6 +906,8 @@
       !profile_->GetPrefs()->GetBoolean(prefs::kDriveFsPinnedMigrated)) {
     MigratePinnedFiles();
   }
+
+  return success;
 }
 
 void DriveIntegrationService::RemoveDriveMountPoint() {
@@ -955,6 +974,44 @@
       remount_delay.value());
 }
 
+void DriveIntegrationService::OnMounted(const base::FilePath& mount_path) {
+  if (AddDriveMountPointAfterMounted()) {
+    PrefService* prefs = profile_->GetPrefs();
+    bool was_ever_mounted =
+        prefs->GetBoolean(prefs::kDriveFsWasLaunchedAtLeastOnce);
+    if (was_ever_mounted) {
+      UmaEmitMountOutcome(DriveMountStatus::kSuccess, mount_start_);
+    } else {
+      UmaEmitFirstLaunch(mount_start_);
+      prefs->SetBoolean(prefs::kDriveFsWasLaunchedAtLeastOnce, true);
+    }
+  } else {
+    UmaEmitMountOutcome(DriveMountStatus::kUnknownFailure, mount_start_);
+  }
+}
+
+void DriveIntegrationService::OnUnmounted(
+    base::Optional<base::TimeDelta> remount_delay) {
+  UmaEmitUnmountOutcome(remount_delay ? DriveMountStatus::kTemporaryUnavailable
+                                      : DriveMountStatus::kUnknownFailure);
+  MaybeRemountFileSystem(remount_delay, false);
+}
+
+void DriveIntegrationService::OnMountFailed(
+    base::Optional<base::TimeDelta> remount_delay) {
+  PrefService* prefs = profile_->GetPrefs();
+  bool was_ever_mounted =
+      prefs->GetBoolean(prefs::kDriveFsWasLaunchedAtLeastOnce);
+  if (was_ever_mounted) {
+    UmaEmitMountOutcome(remount_delay ? DriveMountStatus::kTemporaryUnavailable
+                                      : DriveMountStatus::kUnknownFailure,
+                        mount_start_);
+  } else {
+    // We don't record mount time until we mount successfully at least once.
+  }
+  MaybeRemountFileSystem(remount_delay, true);
+}
+
 void DriveIntegrationService::Initialize() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(NOT_INITIALIZED, state_);
diff --git a/chrome/browser/chromeos/drive/drive_integration_service.h b/chrome/browser/chromeos/drive/drive_integration_service.h
index b45bdce8..00544d15 100644
--- a/chrome/browser/chromeos/drive/drive_integration_service.h
+++ b/chrome/browser/chromeos/drive/drive_integration_service.h
@@ -55,6 +55,15 @@
 class ResourceMetadataStorage;
 }  // namespace internal
 
+// Mounting status. These values are persisted to logs. Entries should not be
+// renumbered and numeric values should never be reused.
+enum class DriveMountStatus {
+  kSuccess = 0,
+  kUnknownFailure = 1,
+  kTemporaryUnavailable = 2,
+  kMaxValue = kTemporaryUnavailable,
+};
+
 // Interface for classes that need to observe events from
 // DriveIntegrationService.  All events are notified on UI thread.
 class DriveIntegrationServiceObserver {
@@ -81,7 +90,8 @@
 // created per-profile.
 class DriveIntegrationService : public KeyedService,
                                 public DriveNotificationObserver,
-                                public content::NotificationObserver {
+                                public content::NotificationObserver,
+                                public drivefs::DriveFsHost::MountObserver {
  public:
   class PreferenceWatcher;
   using DriveFsMojoConnectionDelegateFactory = base::RepeatingCallback<
@@ -135,6 +145,11 @@
   void OnNotificationTimerFired() override;
   void OnPushNotificationEnabled(bool enabled) override;
 
+  // MountObserver implementation.
+  void OnMounted(const base::FilePath& mount_path) override;
+  void OnUnmounted(base::Optional<base::TimeDelta> remount_delay) override;
+  void OnMountFailed(base::Optional<base::TimeDelta> remount_delay) override;
+
   EventLogger* event_logger() { return logger_.get(); }
   DriveServiceInterface* drive_service() { return drive_service_.get(); }
   DebugInfoCollector* debug_info_collector() {
@@ -180,7 +195,7 @@
   void AddDriveMountPoint();
 
   // Registers remote file system for drive mount point.
-  void AddDriveMountPointAfterMounted();
+  bool AddDriveMountPointAfterMounted();
 
   // Unregisters drive mount point from File API.
   void RemoveDriveMountPoint();
@@ -253,6 +268,8 @@
   int drivefs_consecutive_failures_count_ = 0;
   bool remount_when_online_ = false;
 
+  base::TimeTicks mount_start_;
+
   // Note: This should remain the last member so it'll be destroyed and
   // invalidate its weak pointers before any other members are destroyed.
   base::WeakPtrFactory<DriveIntegrationService> weak_ptr_factory_;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
index d0b12aa7..c7f75c3 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -13,6 +13,7 @@
 #include "base/command_line.h"
 #include "base/i18n/string_search.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
@@ -746,7 +747,7 @@
   return base::StrCat({"data:image/png;base64,", encoded});
 }
 
-void SearchDriveFs(
+drivefs::mojom::QueryParameters::QuerySource SearchDriveFs(
     scoped_refptr<ChromeAsyncExtensionFunction> function,
     drivefs::mojom::QueryParametersPtr query,
     bool filter_dirs,
@@ -818,7 +819,7 @@
   std::move(callback).Run(std::move(result));
 }
 
-void SearchDriveFs(
+drivefs::mojom::QueryParameters::QuerySource SearchDriveFs(
     scoped_refptr<ChromeAsyncExtensionFunction> function,
     drivefs::mojom::QueryParametersPtr query,
     bool filter_dirs,
@@ -828,10 +829,11 @@
   drivefs::mojom::SearchQueryPtr search;
   integration_service->GetDriveFsInterface()->StartSearchQuery(
       mojo::MakeRequest(&search), query.Clone());
+  drivefs::mojom::QueryParameters::QuerySource source = query->query_source;
   if (net::NetworkChangeNotifier::IsOffline() &&
-      query->query_source !=
-          drivefs::mojom::QueryParameters::QuerySource::kLocalOnly) {
+      source != drivefs::mojom::QueryParameters::QuerySource::kLocalOnly) {
     // No point trying cloud query if we know we are offline.
+    source = drivefs::mojom::QueryParameters::QuerySource::kLocalOnly;
     OnSearchDriveFs(std::move(function), std::move(search), std::move(query),
                     filter_dirs, std::move(callback),
                     drive::FILE_ERROR_NO_CONNECTION, {});
@@ -841,6 +843,32 @@
         base::BindOnce(&OnSearchDriveFs, std::move(function), std::move(search),
                        std::move(query), filter_dirs, std::move(callback)));
   }
+  return source;
+}
+
+void UmaEmitSearchOutcome(
+    bool success,
+    bool remote,
+    FileManagerPrivateSearchDriveMetadataFunction::SearchType type,
+    const base::TimeTicks& time_started) {
+  const char* infix = nullptr;
+  switch (type) {
+    case FileManagerPrivateSearchDriveMetadataFunction::SearchType::kText:
+      infix = "TextSearchTime";
+      break;
+    case FileManagerPrivateSearchDriveMetadataFunction::SearchType::
+        kSharedWithMe:
+      infix = "SharedSearchTime";
+      break;
+    case FileManagerPrivateSearchDriveMetadataFunction::SearchType::kOffline:
+      infix = "OfflineSearchTime";
+      break;
+  }
+  base::UmaHistogramTimes(
+      base::StrCat(
+          {remote ? "DriveCommon.RemoteSearch." : "DriveCommon.LocalSearch.",
+           infix, success ? ".SuccessTime" : ".FailTime"}),
+      base::TimeTicks::Now() - time_started);
 }
 
 }  // namespace
@@ -1117,6 +1145,9 @@
     return false;
   }
 
+  operation_start_ = base::TimeTicks::Now();
+  is_offline_ = net::NetworkChangeNotifier::IsOffline();
+
   drive::FileSystemInterface* const file_system =
       drive::util::GetFileSystemByProfile(GetProfile());
   if (file_system) {
@@ -1127,10 +1158,13 @@
     // |file_system| is NULL if the backend is DriveFs.
     auto query = drivefs::mojom::QueryParameters::New();
     query->text_content = params->search_params.query;
-    SearchDriveFs(
-        this, std::move(query), false,
-        base::BindOnce(&FileManagerPrivateSearchDriveFunction::OnSearchDriveFs,
-                       this));
+    is_offline_ =
+        SearchDriveFs(
+            this, std::move(query), false,
+            base::BindOnce(
+                &FileManagerPrivateSearchDriveFunction::OnSearchDriveFs,
+                this)) ==
+        drivefs::mojom::QueryParameters::QuerySource::kLocalOnly;
   }
 
   return true;
@@ -1139,6 +1173,10 @@
 void FileManagerPrivateSearchDriveFunction::OnSearchDriveFs(
     std::unique_ptr<base::ListValue> results) {
   if (!results) {
+    UmaEmitSearchOutcome(
+        false, !is_offline_,
+        FileManagerPrivateSearchDriveMetadataFunction::SearchType::kText,
+        operation_start_);
     SendResponse(false);
     return;
   }
@@ -1148,6 +1186,10 @@
   // never actually used, so no need to fill this.
   result->SetKey("nextFeed", base::Value(""));
   SetResult(std::move(result));
+  UmaEmitSearchOutcome(
+      true, !is_offline_,
+      FileManagerPrivateSearchDriveMetadataFunction::SearchType::kText,
+      operation_start_);
   SendResponse(true);
 }
 
@@ -1156,6 +1198,10 @@
     const GURL& next_link,
     std::unique_ptr<SearchResultInfoList> results) {
   if (error != drive::FILE_ERROR_OK) {
+    UmaEmitSearchOutcome(
+        false, !is_offline_,
+        FileManagerPrivateSearchDriveMetadataFunction::SearchType::kText,
+        operation_start_);
     SendResponse(false);
     return;
   }
@@ -1185,6 +1231,10 @@
   result->SetString("nextFeed", next_link.spec());
 
   SetResult(std::move(result));
+  UmaEmitSearchOutcome(
+      true, !is_offline_,
+      FileManagerPrivateSearchDriveMetadataFunction::SearchType::kText,
+      operation_start_);
   SendResponse(true);
 }
 
@@ -1210,6 +1260,9 @@
     return false;
   }
 
+  operation_start_ = base::TimeTicks::Now();
+  is_offline_ = true;  // Legacy search is assumed offline always.
+
   drive::FileSystemInterface* const file_system =
       drive::util::GetFileSystemByProfile(GetProfile());
   // |file_system| is NULL if the backend is DriveFs, otherwise it's legacy
@@ -1219,15 +1272,19 @@
     switch (params->search_params.types) {
       case api::file_manager_private::SEARCH_TYPE_EXCLUDE_DIRECTORIES:
         options = drive::SEARCH_METADATA_EXCLUDE_DIRECTORIES;
+        search_type_ = SearchType::kText;
         break;
       case api::file_manager_private::SEARCH_TYPE_SHARED_WITH_ME:
         options = drive::SEARCH_METADATA_SHARED_WITH_ME;
+        search_type_ = SearchType::kSharedWithMe;
         break;
       case api::file_manager_private::SEARCH_TYPE_OFFLINE:
         options = drive::SEARCH_METADATA_OFFLINE;
+        search_type_ = SearchType::kOffline;
         break;
       case api::file_manager_private::SEARCH_TYPE_ALL:
         options = drive::SEARCH_METADATA_ALL;
+        search_type_ = SearchType::kText;
         break;
       default:
         return false;
@@ -1254,26 +1311,33 @@
     switch (params->search_params.types) {
       case api::file_manager_private::SEARCH_TYPE_EXCLUDE_DIRECTORIES:
         filter_dirs = true;
+        search_type_ = SearchType::kText;
         break;
       case api::file_manager_private::SEARCH_TYPE_SHARED_WITH_ME:
         query->shared_with_me = true;
+        search_type_ = SearchType::kSharedWithMe;
         break;
       case api::file_manager_private::SEARCH_TYPE_OFFLINE:
         query->available_offline = true;
         query->query_source =
             drivefs::mojom::QueryParameters::QuerySource::kLocalOnly;
+        search_type_ = SearchType::kOffline;
         break;
       case api::file_manager_private::SEARCH_TYPE_ALL:
+        search_type_ = SearchType::kText;
         break;
       default:
         return false;
     }
-    SearchDriveFs(
-        this, std::move(query), filter_dirs,
-        base::BindOnce(
-            &FileManagerPrivateSearchDriveMetadataFunction::OnSearchDriveFs,
-            this, params->search_params.query));
+    is_offline_ =
+        SearchDriveFs(
+            this, std::move(query), filter_dirs,
+            base::BindOnce(
+                &FileManagerPrivateSearchDriveMetadataFunction::OnSearchDriveFs,
+                this, params->search_params.query)) ==
+        drivefs::mojom::QueryParameters::QuerySource::kLocalOnly;
   }
+
   return true;
 }
 
@@ -1281,6 +1345,7 @@
     const std::string& query_text,
     std::unique_ptr<base::ListValue> results) {
   if (!results) {
+    UmaEmitSearchOutcome(false, !is_offline_, search_type_, operation_start_);
     SendResponse(false);
     return;
   }
@@ -1319,6 +1384,7 @@
   }
 
   SetResult(std::move(results_list));
+  UmaEmitSearchOutcome(true, !is_offline_, search_type_, operation_start_);
   SendResponse(true);
 }
 
@@ -1326,6 +1392,7 @@
     drive::FileError error,
     std::unique_ptr<drive::MetadataSearchResultVector> results) {
   if (error != drive::FILE_ERROR_OK) {
+    UmaEmitSearchOutcome(false, !is_offline_, search_type_, operation_start_);
     SendResponse(false);
     return;
   }
@@ -1367,6 +1434,7 @@
   }
 
   SetResult(std::move(results_list));
+  UmaEmitSearchOutcome(true, !is_offline_, search_type_, operation_start_);
   SendResponse(true);
 }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
index 0e33194..fbd1fdaf 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
@@ -150,6 +150,9 @@
       std::unique_ptr<SearchResultInfoList> search_result_info_list,
       std::unique_ptr<file_manager::util::EntryDefinitionList>
           entry_definition_list);
+
+  base::TimeTicks operation_start_;
+  bool is_offline_;
 };
 
 // Similar to FileManagerPrivateSearchDriveFunction but this one is used for
@@ -157,6 +160,12 @@
 class FileManagerPrivateSearchDriveMetadataFunction
     : public LoggedAsyncExtensionFunction {
  public:
+  enum class SearchType {
+    kText,
+    kSharedWithMe,
+    kOffline,
+  };
+
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.searchDriveMetadata",
                              FILEMANAGERPRIVATE_SEARCHDRIVEMETADATA)
 
@@ -181,6 +190,10 @@
           search_result_info_list,
       std::unique_ptr<file_manager::util::EntryDefinitionList>
           entry_definition_list);
+
+  base::TimeTicks operation_start_;
+  SearchType search_type_;
+  bool is_offline_;
 };
 
 // Implements the chrome.fileManagerPrivate.getDriveConnectionState method.
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index 987b95a..2695094 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -399,6 +399,7 @@
                       TestCase("openQuickViewBackgroundColorHtml"),
                       TestCase("openQuickViewDrive"),
                       TestCase("openQuickViewDrive").EnableDriveFs(),
+                      TestCase("openQuickViewAndroid"),
                       TestCase("openQuickViewCrostini"),
                       TestCase("openQuickViewUsb"),
                       TestCase("openQuickViewMtp"),
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index 3a2a2ce..67a34175 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -731,6 +731,10 @@
   VLOG(1) << "Setting first login prefs";
   InitLocaleAndInputMethodsForNewUser(this, profile, public_session_locale,
                                       public_session_input_method);
+
+  // Since there is no images after first login, set the parameter to true to
+  // avoid camera media migration.
+  profile->GetPrefs()->SetBoolean(prefs::kCameraMediaConsolidated, true);
 }
 
 bool UserSessionManager::GetAppModeChromeClientOAuthInfo(
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
index 3efc75d..70f7913d 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
@@ -384,7 +384,8 @@
           DeviceStatusCollector::VolumeInfoFetcher(),
           DeviceStatusCollector::CPUStatisticsFetcher(),
           DeviceStatusCollector::CPUTempFetcher(),
-          DeviceStatusCollector::AndroidStatusFetcher(), kActivityDayStart,
+          DeviceStatusCollector::AndroidStatusFetcher(),
+          DeviceStatusCollector::TpmStatusFetcher(), kActivityDayStart,
           true /* is_enterprise_device */),
       task_runner_, kDeviceStatusUploadFrequency));
 }
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc
index 33835005..54a1f15 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -12,6 +12,7 @@
 #include <limits>
 #include <set>
 #include <sstream>
+#include <utility>
 
 #include "base/base64.h"
 #include "base/bind.h"
@@ -21,6 +22,7 @@
 #include "base/format_macros.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -49,6 +51,8 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/audio/cras_audio_handler.h"
+#include "chromeos/dbus/cryptohome/rpc.pb.h"
+#include "chromeos/dbus/cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power_manager/idle.pb.h"
 #include "chromeos/dbus/update_engine_client.h"
@@ -255,6 +259,57 @@
   return true;
 }
 
+// Converts the given GetTpmStatusReply to TpmStatusInfo.
+policy::TpmStatusInfo GetTpmStatusReplyToTpmStatusInfo(
+    const base::Optional<cryptohome::BaseReply>& reply) {
+  policy::TpmStatusInfo tpm_status_info;
+
+  if (!reply.has_value()) {
+    LOG(ERROR) << "GetTpmStatus call failed with empty reply.";
+    return tpm_status_info;
+  }
+  if (reply->has_error() &&
+      reply->error() != cryptohome::CRYPTOHOME_ERROR_NOT_SET) {
+    LOG(ERROR) << "GetTpmStatus failed with error: " << reply->error();
+    return tpm_status_info;
+  }
+  if (!reply->HasExtension(cryptohome::GetTpmStatusReply::reply)) {
+    LOG(ERROR)
+        << "GetTpmStatus failed with no GetTpmStatusReply extension in reply.";
+    return tpm_status_info;
+  }
+
+  auto reply_proto = reply->GetExtension(cryptohome::GetTpmStatusReply::reply);
+
+  tpm_status_info.enabled = reply_proto.enabled();
+  tpm_status_info.owned = reply_proto.owned();
+  tpm_status_info.initialized = reply_proto.initialized();
+  tpm_status_info.attestation_prepared = reply_proto.attestation_prepared();
+  tpm_status_info.attestation_enrolled = reply_proto.attestation_enrolled();
+  tpm_status_info.dictionary_attack_counter =
+      reply_proto.dictionary_attack_counter();
+  tpm_status_info.dictionary_attack_threshold =
+      reply_proto.dictionary_attack_threshold();
+  tpm_status_info.dictionary_attack_lockout_in_effect =
+      reply_proto.dictionary_attack_lockout_in_effect();
+  tpm_status_info.dictionary_attack_lockout_seconds_remaining =
+      reply_proto.dictionary_attack_lockout_seconds_remaining();
+  tpm_status_info.boot_lockbox_finalized = reply_proto.boot_lockbox_finalized();
+
+  return tpm_status_info;
+}
+
+void ReadTpmStatus(policy::DeviceStatusCollector::TpmStatusReceiver callback) {
+  chromeos::DBusThreadManager::Get()->GetCryptohomeClient()->GetTpmStatus(
+      cryptohome::GetTpmStatusRequest(),
+      base::BindOnce(
+          [](policy::DeviceStatusCollector::TpmStatusReceiver callback,
+             base::Optional<cryptohome::BaseReply> reply) {
+            std::move(callback).Run(GetTpmStatusReplyToTpmStatusInfo(reply));
+          },
+          std::move(callback)));
+}
+
 // Returns the DeviceLocalAccount associated with the current kiosk session.
 // Returns null if there is no active kiosk session, or if that kiosk
 // session has been removed from policy since the session started, in which
@@ -387,6 +442,17 @@
         base::Bind(&GetStatusState::OnAndroidInfoReceived, this));
   }
 
+  // Queues an async callback to query TPM status information.
+  void FetchTpmStatus(const policy::DeviceStatusCollector::TpmStatusFetcher&
+                          tpm_status_fetcher) {
+    // Call out to the blocking pool to get TPM status information.
+    base::PostTaskWithTraits(
+        FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+        base::BindOnce(
+            tpm_status_fetcher,
+            base::BindOnce(&GetStatusState::OnTpmStatusReceived, this)));
+  }
+
  private:
   friend class RefCountedThreadSafe<GetStatusState>;
 
@@ -423,6 +489,29 @@
     android_status->set_droid_guard_info(droid_guard_info);
   }
 
+  void OnTpmStatusReceived(const TpmStatusInfo& tpm_status_struct) {
+    em::TpmStatusInfo* const tpm_status_proto =
+        device_status_->mutable_tpm_status_info();
+
+    tpm_status_proto->set_enabled(tpm_status_struct.enabled);
+    tpm_status_proto->set_owned(tpm_status_struct.owned);
+    tpm_status_proto->set_initialized(tpm_status_struct.initialized);
+    tpm_status_proto->set_attestation_prepared(
+        tpm_status_struct.attestation_prepared);
+    tpm_status_proto->set_attestation_enrolled(
+        tpm_status_struct.attestation_enrolled);
+    tpm_status_proto->set_dictionary_attack_counter(
+        tpm_status_struct.dictionary_attack_counter);
+    tpm_status_proto->set_dictionary_attack_threshold(
+        tpm_status_struct.dictionary_attack_threshold);
+    tpm_status_proto->set_dictionary_attack_lockout_in_effect(
+        tpm_status_struct.dictionary_attack_lockout_in_effect);
+    tpm_status_proto->set_dictionary_attack_lockout_seconds_remaining(
+        tpm_status_struct.dictionary_attack_lockout_seconds_remaining);
+    tpm_status_proto->set_boot_lockbox_finalized(
+        tpm_status_struct.boot_lockbox_finalized);
+  }
+
   const scoped_refptr<base::SequencedTaskRunner> task_runner_;
   policy::DeviceStatusCollector::StatusCallback response_;
   std::unique_ptr<em::DeviceStatusReportRequest> device_status_ =
@@ -515,6 +604,32 @@
   DISALLOW_COPY_AND_ASSIGN(ActivityStorage);
 };
 
+TpmStatusInfo::TpmStatusInfo() = default;
+TpmStatusInfo::TpmStatusInfo(const TpmStatusInfo&) = default;
+TpmStatusInfo::TpmStatusInfo(
+    bool enabled,
+    bool owned,
+    bool initialized,
+    bool attestation_prepared,
+    bool attestation_enrolled,
+    int32_t dictionary_attack_counter,
+    int32_t dictionary_attack_threshold,
+    bool dictionary_attack_lockout_in_effect,
+    int32_t dictionary_attack_lockout_seconds_remaining,
+    bool boot_lockbox_finalized)
+    : enabled(enabled),
+      owned(owned),
+      initialized(initialized),
+      attestation_prepared(attestation_prepared),
+      attestation_enrolled(attestation_enrolled),
+      dictionary_attack_counter(dictionary_attack_counter),
+      dictionary_attack_threshold(dictionary_attack_threshold),
+      dictionary_attack_lockout_in_effect(dictionary_attack_lockout_in_effect),
+      dictionary_attack_lockout_seconds_remaining(
+          dictionary_attack_lockout_seconds_remaining),
+      boot_lockbox_finalized(boot_lockbox_finalized) {}
+TpmStatusInfo::~TpmStatusInfo() = default;
+
 DeviceStatusCollector::ActivityStorage::ActivityStorage(
     PrefService* pref_service,
     const std::string& pref_name,
@@ -751,6 +866,7 @@
     const CPUStatisticsFetcher& cpu_statistics_fetcher,
     const CPUTempFetcher& cpu_temp_fetcher,
     const AndroidStatusFetcher& android_status_fetcher,
+    const TpmStatusFetcher& tpm_status_fetcher,
     TimeDelta activity_day_start,
     bool is_enterprise_reporting)
     : max_stored_past_activity_interval_(kMaxStoredPastActivityInterval),
@@ -763,6 +879,7 @@
       cpu_statistics_fetcher_(cpu_statistics_fetcher),
       cpu_temp_fetcher_(cpu_temp_fetcher),
       android_status_fetcher_(android_status_fetcher),
+      tpm_status_fetcher_(tpm_status_fetcher),
       statistics_provider_(provider),
       cros_settings_(chromeos::CrosSettings::Get()),
       power_manager_(
@@ -788,6 +905,9 @@
   if (android_status_fetcher_.is_null())
     android_status_fetcher_ = base::Bind(&ReadAndroidStatus);
 
+  if (tpm_status_fetcher_.is_null())
+    tpm_status_fetcher_ = base::BindRepeating(&ReadTpmStatus);
+
   idle_poll_timer_.Start(FROM_HERE,
                          TimeDelta::FromSeconds(kIdlePollIntervalSeconds), this,
                          &DeviceStatusCollector::CheckIdleState);
@@ -1439,6 +1559,9 @@
   chromeos::CrasAudioHandler* audio_handler = chromeos::CrasAudioHandler::Get();
   status->set_sound_volume(audio_handler->GetOutputVolumePercent());
 
+  // Fetch TPM status information on a background thread.
+  state->FetchTpmStatus(tpm_status_fetcher_);
+
   return true;
 }
 
diff --git a/chrome/browser/chromeos/policy/device_status_collector.h b/chrome/browser/chromeos/policy/device_status_collector.h
index 8f1ae47..5a9760f8 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.h
+++ b/chrome/browser/chromeos/policy/device_status_collector.h
@@ -39,6 +39,10 @@
 }
 }
 
+namespace cryptohome {
+struct TpmStatusInfo;
+}
+
 namespace user_manager {
 class User;
 }
@@ -53,6 +57,34 @@
 struct DeviceLocalAccount;
 class GetStatusState;
 
+// Holds TPM status info.  Cf. TpmStatusInfo in device_management_backend.proto.
+struct TpmStatusInfo {
+  TpmStatusInfo();
+  TpmStatusInfo(const TpmStatusInfo&);
+  TpmStatusInfo(bool enabled,
+                bool owned,
+                bool initialized,
+                bool attestation_prepared,
+                bool attestation_enrolled,
+                int32_t dictionary_attack_counter,
+                int32_t dictionary_attack_threshold,
+                bool dictionary_attack_lockout_in_effect,
+                int32_t dictionary_attack_lockout_seconds_remaining,
+                bool boot_lockbox_finalized);
+  ~TpmStatusInfo();
+
+  bool enabled = false;
+  bool owned = false;
+  bool initialized = false;
+  bool attestation_prepared = false;
+  bool attestation_enrolled = false;
+  int32_t dictionary_attack_counter = 0;
+  int32_t dictionary_attack_threshold = 0;
+  bool dictionary_attack_lockout_in_effect = false;
+  int32_t dictionary_attack_lockout_seconds_remaining = 0;
+  bool boot_lockbox_finalized = false;
+};
+
 // Collects and summarizes the status of an enterprised-managed ChromeOS device.
 class DeviceStatusCollector : public session_manager::SessionManagerObserver,
                               public chromeos::PowerManagerClient::Observer {
@@ -85,6 +117,11 @@
   using AndroidStatusFetcher =
       base::Callback<bool(const AndroidStatusReceiver&)>;
 
+  // Format of the function that asynchronously receives TpmStatusInfo.
+  using TpmStatusReceiver = base::OnceCallback<void(const TpmStatusInfo&)>;
+  // Gets the TpmStatusInfo and passes it to TpmStatusReceiver.
+  using TpmStatusFetcher = base::RepeatingCallback<void(TpmStatusReceiver)>;
+
   // Called in the UI thread after the device and session status have been
   // collected asynchronously in GetDeviceAndSessionStatusAsync. Null pointers
   // indicate errors or that device or session status reporting is disabled.
@@ -106,6 +143,7 @@
                         const CPUStatisticsFetcher& cpu_statistics_fetcher,
                         const CPUTempFetcher& cpu_temp_fetcher,
                         const AndroidStatusFetcher& android_status_fetcher,
+                        const TpmStatusFetcher& tpm_status_fetcher,
                         base::TimeDelta activity_day_start,
                         bool is_enterprise_reporting);
   ~DeviceStatusCollector() override;
@@ -308,6 +346,8 @@
 
   AndroidStatusFetcher android_status_fetcher_;
 
+  TpmStatusFetcher tpm_status_fetcher_;
+
   chromeos::system::StatisticsProvider* const statistics_provider_;
 
   chromeos::CrosSettings* const cros_settings_;
diff --git a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
index 067cefa5..151c23d 100644
--- a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
@@ -130,6 +130,7 @@
       const policy::DeviceStatusCollector::CPUTempFetcher& cpu_temp_fetcher,
       const policy::DeviceStatusCollector::AndroidStatusFetcher&
           android_status_fetcher,
+      const policy::DeviceStatusCollector::TpmStatusFetcher& tpm_status_fetcher,
       TimeDelta activity_day_start,
       bool is_enterprise_device)
       : policy::DeviceStatusCollector(pref_service,
@@ -138,6 +139,7 @@
                                       cpu_fetcher,
                                       cpu_temp_fetcher,
                                       android_status_fetcher,
+                                      tpm_status_fetcher,
                                       activity_day_start,
                                       is_enterprise_device) {
     // Set the baseline time to a fixed value (1 hour after day start) to
@@ -268,6 +270,11 @@
   return std::vector<em::CPUTempInfo>();
 }
 
+std::vector<em::CPUTempInfo> GetFakeCPUTempInfo(
+    const std::vector<em::CPUTempInfo>& cpu_temp_info) {
+  return cpu_temp_info;
+}
+
 void CallAndroidStatusReceiver(
     const policy::DeviceStatusCollector::AndroidStatusReceiver& receiver,
     const std::string& status,
@@ -275,6 +282,14 @@
   receiver.Run(status, droid_guard_info);
 }
 
+bool GetEmptyAndroidStatus(
+    const policy::DeviceStatusCollector::AndroidStatusReceiver& receiver) {
+  // Post it to the thread because this call is expected to be asynchronous.
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&CallAndroidStatusReceiver, receiver, "", ""));
+  return true;
+}
+
 bool GetFakeAndroidStatus(
     const std::string& status,
     const std::string& droid_guard_info,
@@ -286,17 +301,15 @@
   return true;
 }
 
-bool GetEmptyAndroidStatus(
-    const policy::DeviceStatusCollector::AndroidStatusReceiver& receiver) {
-  // Post it to the thread because this call is expected to be asynchronous.
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&CallAndroidStatusReceiver, receiver, "", ""));
-  return true;
+void GetEmptyTpmStatus(
+    policy::DeviceStatusCollector::TpmStatusReceiver receiver) {
+  std::move(receiver).Run(policy::TpmStatusInfo());
 }
 
-std::vector<em::CPUTempInfo> GetFakeCPUTempInfo(
-    const std::vector<em::CPUTempInfo>& cpu_temp_info) {
-  return cpu_temp_info;
+void GetFakeTpmStatus(
+    const policy::TpmStatusInfo& tpm_status_info,
+    policy::DeviceStatusCollector::TpmStatusReceiver receiver) {
+  std::move(receiver).Run(tpm_status_info);
 }
 
 }  // namespace
@@ -409,7 +422,8 @@
     RestartStatusCollector(base::BindRepeating(&GetEmptyVolumeInfo),
                            base::BindRepeating(&GetEmptyCPUStatistics),
                            base::BindRepeating(&GetEmptyCPUTempInfo),
-                           base::BindRepeating(&GetEmptyAndroidStatus));
+                           base::BindRepeating(&GetEmptyAndroidStatus),
+                           base::BindRepeating(&GetEmptyTpmStatus));
 
     // Disable network interface reporting since it requires additional setup.
     settings_helper_.SetBoolean(chromeos::kReportDeviceNetworkInterfaces,
@@ -481,11 +495,13 @@
       const policy::DeviceStatusCollector::CPUStatisticsFetcher& cpu_stats,
       const policy::DeviceStatusCollector::CPUTempFetcher& cpu_temp_fetcher,
       const policy::DeviceStatusCollector::AndroidStatusFetcher&
-          android_status_fetcher) {
+          android_status_fetcher,
+      const policy::DeviceStatusCollector::TpmStatusFetcher&
+          tpm_status_fetcher) {
     std::vector<em::VolumeInfo> expected_volume_info;
     status_collector_.reset(new TestingDeviceStatusCollector(
         &local_state_, &fake_statistics_provider_, volume_info, cpu_stats,
-        cpu_temp_fetcher, android_status_fetcher, kMidnight,
+        cpu_temp_fetcher, android_status_fetcher, tpm_status_fetcher, kMidnight,
         true /* is_enterprise_device */));
   }
 
@@ -494,7 +510,7 @@
     session_status_.Clear();
     got_session_status_ = false;
     run_loop_.reset(new base::RunLoop());
-    status_collector_->GetDeviceAndSessionStatusAsync(base::Bind(
+    status_collector_->GetDeviceAndSessionStatusAsync(base::BindRepeating(
         &DeviceStatusCollectorTest::OnStatusReceived, base::Unretained(this)));
     run_loop_->Run();
     run_loop_.reset();
@@ -788,10 +804,11 @@
   // Process the list a second time after restarting the collector. It should be
   // able to count the active periods found by the original collector, because
   // the results are stored in a pref.
-  RestartStatusCollector(base::Bind(&GetEmptyVolumeInfo),
-                         base::Bind(&GetEmptyCPUStatistics),
-                         base::Bind(&GetEmptyCPUTempInfo),
-                         base::Bind(&GetEmptyAndroidStatus));
+  RestartStatusCollector(base::BindRepeating(&GetEmptyVolumeInfo),
+                         base::BindRepeating(&GetEmptyCPUStatistics),
+                         base::BindRepeating(&GetEmptyCPUTempInfo),
+                         base::BindRepeating(&GetEmptyAndroidStatus),
+                         base::BindRepeating(&GetEmptyTpmStatus));
   status_collector_->Simulate(test_states,
                               sizeof(test_states) / sizeof(ui::IdleState));
 
@@ -1181,10 +1198,12 @@
   }
   EXPECT_FALSE(expected_volume_info.empty());
 
-  RestartStatusCollector(base::Bind(&GetFakeVolumeInfo, expected_volume_info),
-                         base::Bind(&GetEmptyCPUStatistics),
-                         base::Bind(&GetEmptyCPUTempInfo),
-                         base::Bind(&GetEmptyAndroidStatus));
+  RestartStatusCollector(
+      base::BindRepeating(&GetFakeVolumeInfo, expected_volume_info),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetEmptyAndroidStatus),
+      base::BindRepeating(&GetEmptyTpmStatus));
   // Force finishing tasks posted by ctor of DeviceStatusCollector.
   content::RunAllTasksUntilIdle();
 
@@ -1234,10 +1253,12 @@
 TEST_F(DeviceStatusCollectorTest, TestCPUSamples) {
   // Mock 100% CPU usage.
   std::string full_cpu_usage("cpu  500 0 500 0 0 0 0");
-  RestartStatusCollector(base::Bind(&GetEmptyVolumeInfo),
-                         base::Bind(&GetFakeCPUStatistics, full_cpu_usage),
-                         base::Bind(&GetEmptyCPUTempInfo),
-                         base::Bind(&GetEmptyAndroidStatus));
+  RestartStatusCollector(
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetFakeCPUStatistics, full_cpu_usage),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetEmptyAndroidStatus),
+      base::BindRepeating(&GetEmptyTpmStatus));
   // Force finishing tasks posted by ctor of DeviceStatusCollector.
   content::RunAllTasksUntilIdle();
   GetStatus();
@@ -1285,10 +1306,12 @@
     expected_temp_info.push_back(info);
   }
 
-  RestartStatusCollector(base::Bind(&GetEmptyVolumeInfo),
-                         base::Bind(&GetEmptyCPUStatistics),
-                         base::Bind(&GetFakeCPUTempInfo, expected_temp_info),
-                         base::Bind(&GetEmptyAndroidStatus));
+  RestartStatusCollector(
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetFakeCPUTempInfo, expected_temp_info),
+      base::BindRepeating(&GetEmptyAndroidStatus),
+      base::BindRepeating(&GetEmptyTpmStatus));
   // Force finishing tasks posted by ctor of DeviceStatusCollector.
   content::RunAllTasksUntilIdle();
 
@@ -1317,11 +1340,12 @@
 }
 
 TEST_F(DeviceStatusCollectorTest, KioskAndroidReporting) {
-  RestartStatusCollector(base::Bind(&GetEmptyVolumeInfo),
-                         base::Bind(&GetEmptyCPUStatistics),
-                         base::Bind(&GetEmptyCPUTempInfo),
-                         base::Bind(&GetFakeAndroidStatus, kArcStatus,
-                             kDroidGuardInfo));
+  RestartStatusCollector(
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
   status_collector_->set_kiosk_account(
       std::make_unique<DeviceLocalAccount>(fake_kiosk_device_local_account_));
   MockRunningKioskApp(fake_kiosk_device_local_account_, false /* arc_kiosk */);
@@ -1337,11 +1361,12 @@
 }
 
 TEST_F(DeviceStatusCollectorTest, NoKioskAndroidReportingWhenDisabled) {
-  RestartStatusCollector(base::Bind(&GetEmptyVolumeInfo),
-                         base::Bind(&GetEmptyCPUStatistics),
-                         base::Bind(&GetEmptyCPUTempInfo),
-                         base::Bind(&GetFakeAndroidStatus, kArcStatus,
-                             kDroidGuardInfo));
+  RestartStatusCollector(
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
 
   // Mock Kiosk app, so some session status is reported
   status_collector_->set_kiosk_account(
@@ -1357,9 +1382,11 @@
 
 TEST_F(DeviceStatusCollectorTest, RegularUserAndroidReporting) {
   RestartStatusCollector(
-      base::Bind(&GetEmptyVolumeInfo), base::Bind(&GetEmptyCPUStatistics),
-      base::Bind(&GetEmptyCPUTempInfo),
-      base::Bind(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo));
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
 
   const AccountId account_id(AccountId::FromUserEmail("user0@managed.com"));
   MockRegularUserWithAffiliation(account_id, true);
@@ -1377,9 +1404,11 @@
 
 TEST_F(DeviceStatusCollectorTest, RegularUserCrostiniReporting) {
   RestartStatusCollector(
-      base::Bind(&GetEmptyVolumeInfo), base::Bind(&GetEmptyCPUStatistics),
-      base::Bind(&GetEmptyCPUTempInfo),
-      base::Bind(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo));
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
 
   const AccountId account_id(AccountId::FromUserEmail("user0@managed.com"));
   MockRegularUserWithAffiliation(account_id, true);
@@ -1402,9 +1431,11 @@
 
 TEST_F(DeviceStatusCollectorTest, RegularUserCrostiniReportingNoData) {
   RestartStatusCollector(
-      base::Bind(&GetEmptyVolumeInfo), base::Bind(&GetEmptyCPUStatistics),
-      base::Bind(&GetEmptyCPUTempInfo),
-      base::Bind(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo));
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
 
   const AccountId account_id(AccountId::FromUserEmail("user0@managed.com"));
   MockRegularUserWithAffiliation(account_id, true);
@@ -1421,9 +1452,11 @@
 
 TEST_F(DeviceStatusCollectorTest, NoRegularUserReportingByDefault) {
   RestartStatusCollector(
-      base::Bind(&GetEmptyVolumeInfo), base::Bind(&GetEmptyCPUStatistics),
-      base::Bind(&GetEmptyCPUTempInfo),
-      base::Bind(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo));
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
 
   const AccountId account_id(AccountId::FromUserEmail("user0@managed.com"));
   MockRegularUserWithAffiliation(account_id, true);
@@ -1440,9 +1473,11 @@
 TEST_F(DeviceStatusCollectorTest,
        NoRegularUserAndroidReportingWhenNotAffiliated) {
   RestartStatusCollector(
-      base::Bind(&GetEmptyVolumeInfo), base::Bind(&GetEmptyCPUStatistics),
-      base::Bind(&GetEmptyCPUTempInfo),
-      base::Bind(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo));
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
 
   const AccountId account_id(AccountId::FromUserEmail("user0@managed.com"));
   MockRegularUserWithAffiliation(account_id, false);
@@ -1455,6 +1490,52 @@
   EXPECT_FALSE(got_session_status_);
 }
 
+TEST_F(DeviceStatusCollectorTest, TpmStatusReporting) {
+  // Create a fake TPM status info and populate it with some random values.
+  const policy::TpmStatusInfo kFakeTpmStatus{
+      true,  /* enabled */
+      false, /* owned */
+      true,  /* initialized */
+      false, /* attestation_prepared */
+      true,  /* attestation_enrolled */
+      5,     /* dictionary_attack_counter */
+      10,    /* dictionary_attack_threshold */
+      false, /* dictionary_attack_lockout_in_effect */
+      0,     /* dictionary_attack_lockout_seconds_remaining */
+      true   /* boot_lockbox_finalized */
+  };
+  RestartStatusCollector(
+      base::BindRepeating(&GetEmptyVolumeInfo),
+      base::BindRepeating(&GetEmptyCPUStatistics),
+      base::BindRepeating(&GetEmptyCPUTempInfo),
+      base::BindRepeating(&GetEmptyAndroidStatus),
+      base::BindRepeating(&GetFakeTpmStatus, kFakeTpmStatus));
+
+  GetStatus();
+
+  EXPECT_TRUE(device_status_.has_tpm_status_info());
+  EXPECT_EQ(kFakeTpmStatus.enabled, device_status_.tpm_status_info().enabled());
+  EXPECT_EQ(kFakeTpmStatus.owned, device_status_.tpm_status_info().owned());
+  EXPECT_EQ(kFakeTpmStatus.initialized,
+            device_status_.tpm_status_info().initialized());
+  EXPECT_EQ(kFakeTpmStatus.attestation_prepared,
+            device_status_.tpm_status_info().attestation_prepared());
+  EXPECT_EQ(kFakeTpmStatus.attestation_enrolled,
+            device_status_.tpm_status_info().attestation_enrolled());
+  EXPECT_EQ(kFakeTpmStatus.dictionary_attack_counter,
+            device_status_.tpm_status_info().dictionary_attack_counter());
+  EXPECT_EQ(kFakeTpmStatus.dictionary_attack_threshold,
+            device_status_.tpm_status_info().dictionary_attack_threshold());
+  EXPECT_EQ(
+      kFakeTpmStatus.dictionary_attack_lockout_in_effect,
+      device_status_.tpm_status_info().dictionary_attack_lockout_in_effect());
+  EXPECT_EQ(kFakeTpmStatus.dictionary_attack_lockout_seconds_remaining,
+            device_status_.tpm_status_info()
+                .dictionary_attack_lockout_seconds_remaining());
+  EXPECT_EQ(kFakeTpmStatus.boot_lockbox_finalized,
+            device_status_.tpm_status_info().boot_lockbox_finalized());
+}
+
 TEST_F(DeviceStatusCollectorTest, NoTimeZoneReporting) {
   // Time zone is not reported in enterprise reports.
   const AccountId account_id(AccountId::FromUserEmail("user0@managed.com"));
@@ -1798,7 +1879,8 @@
         base::BindRepeating(&GetEmptyVolumeInfo),
         base::BindRepeating(&GetEmptyCPUStatistics),
         base::BindRepeating(&GetEmptyCPUTempInfo),
-        base::BindRepeating(&GetEmptyAndroidStatus), activity_day_start,
+        base::BindRepeating(&GetEmptyAndroidStatus),
+        base::BindRepeating(&GetEmptyTpmStatus), activity_day_start,
         true /* is_enterprise_reporting */);
   }
 
@@ -2006,7 +2088,8 @@
     RestartStatusCollector(base::BindRepeating(&GetEmptyVolumeInfo),
                            base::BindRepeating(&GetEmptyCPUStatistics),
                            base::BindRepeating(&GetEmptyCPUTempInfo),
-                           base::BindRepeating(&GetEmptyAndroidStatus));
+                           base::BindRepeating(&GetEmptyAndroidStatus),
+                           base::BindRepeating(&GetEmptyTpmStatus));
 
     chromeos::DBusThreadManager::Initialize();
     chromeos::NetworkHandler::Initialize();
@@ -2245,11 +2328,13 @@
       const policy::DeviceStatusCollector::CPUStatisticsFetcher& cpu_stats,
       const policy::DeviceStatusCollector::CPUTempFetcher& cpu_temp_fetcher,
       const policy::DeviceStatusCollector::AndroidStatusFetcher&
-          android_status_fetcher) override {
+          android_status_fetcher,
+      const policy::DeviceStatusCollector::TpmStatusFetcher& tpm_status_fetcher)
+      override {
     status_collector_ = std::make_unique<TestingDeviceStatusCollector>(
         &profile_pref_service_, &fake_statistics_provider_, volume_info,
-        cpu_stats, cpu_temp_fetcher, android_status_fetcher, kMidnight,
-        false /* is_enterprise_reporting */);
+        cpu_stats, cpu_temp_fetcher, android_status_fetcher, tpm_status_fetcher,
+        kMidnight, false /* is_enterprise_reporting */);
   }
 
   AccountId user_account_id_;
@@ -2284,7 +2369,8 @@
       base::BindRepeating(&GetEmptyVolumeInfo),
       base::BindRepeating(&GetEmptyCPUStatistics),
       base::BindRepeating(&GetEmptyCPUTempInfo),
-      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo));
+      base::BindRepeating(&GetFakeAndroidStatus, kArcStatus, kDroidGuardInfo),
+      base::BindRepeating(&GetEmptyTpmStatus));
 
   testing_profile_->GetPrefs()->SetBoolean(prefs::kReportArcStatusEnabled,
                                            true);
@@ -2333,7 +2419,8 @@
       base::BindRepeating(&GetFakeVolumeInfo, expected_volume_info),
       base::BindRepeating(&GetEmptyCPUStatistics),
       base::BindRepeating(&GetEmptyCPUTempInfo),
-      base::BindRepeating(&GetEmptyAndroidStatus));
+      base::BindRepeating(&GetEmptyAndroidStatus),
+      base::BindRepeating(&GetEmptyTpmStatus));
   content::RunAllTasksUntilIdle();
 
   GetStatus();
@@ -2383,7 +2470,8 @@
       base::BindRepeating(&GetEmptyVolumeInfo),
       base::BindRepeating(&GetFakeCPUStatistics, full_cpu_usage),
       base::BindRepeating(&GetFakeCPUTempInfo, expected_temp_info),
-      base::BindRepeating(&GetEmptyAndroidStatus));
+      base::BindRepeating(&GetEmptyAndroidStatus),
+      base::BindRepeating(&GetEmptyTpmStatus));
   content::RunAllTasksUntilIdle();
 
   GetStatus();
@@ -2393,6 +2481,7 @@
   EXPECT_EQ(0, device_status_.cpu_temp_info_size());
   EXPECT_EQ(0, device_status_.system_ram_free().size());
   EXPECT_FALSE(device_status_.has_system_ram_total());
+  EXPECT_FALSE(device_status_.has_tpm_status_info());
 }
 
 TEST_F(ConsumerDeviceStatusCollectorTimeLimitDisabledTest, TimeZoneReporting) {
@@ -2538,7 +2627,8 @@
   RestartStatusCollector(base::BindRepeating(&GetEmptyVolumeInfo),
                          base::BindRepeating(&GetEmptyCPUStatistics),
                          base::BindRepeating(&GetEmptyCPUTempInfo),
-                         base::BindRepeating(&GetEmptyAndroidStatus));
+                         base::BindRepeating(&GetEmptyAndroidStatus),
+                         base::BindRepeating(&GetEmptyTpmStatus));
   SimulateStateChanges(test_states,
                        sizeof(test_states) / sizeof(DeviceStateTransitions));
 
diff --git a/chrome/browser/chromeos/policy/status_uploader_unittest.cc b/chrome/browser/chromeos/policy/status_uploader_unittest.cc
index dedb025f..3e9c27e 100644
--- a/chrome/browser/chromeos/policy/status_uploader_unittest.cc
+++ b/chrome/browser/chromeos/policy/status_uploader_unittest.cc
@@ -56,6 +56,7 @@
             policy::DeviceStatusCollector::CPUStatisticsFetcher(),
             policy::DeviceStatusCollector::CPUTempFetcher(),
             policy::DeviceStatusCollector::AndroidStatusFetcher(),
+            policy::DeviceStatusCollector::TpmStatusFetcher(),
             base::TimeDelta(), /* Day starts at midnight */
             true /* is_enterprise_device */) {}
 
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index fe6abec..c474785 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -317,6 +317,8 @@
   registry->RegisterBooleanPref(
       drive::prefs::kDisableDriveHostedFiles, false,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+  registry->RegisterBooleanPref(drive::prefs::kDriveFsWasLaunchedAtLeastOnce,
+                                false);
   registry->RegisterStringPref(drive::prefs::kDriveFsProfileSalt, "");
   registry->RegisterBooleanPref(drive::prefs::kDriveFsPinnedMigrated, false);
   // We don't sync prefs::kLanguageCurrentInputMethod and PreviousInputMethod
diff --git a/chrome/browser/chromeos/smb_client/smb_service.cc b/chrome/browser/chromeos/smb_client/smb_service.cc
index b7c870f..9a01a0b 100644
--- a/chrome/browser/chromeos/smb_client/smb_service.cc
+++ b/chrome/browser/chromeos/smb_client/smb_service.cc
@@ -62,6 +62,19 @@
 }
 
 // Metric recording functions.
+
+// This enum is used to define the buckets for an enumerated UMA histogram.
+// Hence,
+//   (a) existing enumerated constants should never be deleted or reordered, and
+//   (b) new constants should only be appended at the end of the enumeration.
+enum class AuthMethod {
+  kNoCredentials = 0,
+  kUsernameOnly = 1,
+  kUsernameAndPassword = 2,
+  kSSOKerberos = 3,
+  kMaxValue = kSSOKerberos,
+};
+
 void RecordMountResult(SmbMountResult result) {
   DCHECK_LE(result, SmbMountResult::kMaxValue);
   UMA_HISTOGRAM_ENUMERATION("NativeSmbFileShare.MountResult", result);
@@ -72,6 +85,11 @@
   UMA_HISTOGRAM_ENUMERATION("NativeSmbFileShare.RemountResult", result);
 }
 
+void RecordAuthenticationMethod(AuthMethod method) {
+  DCHECK_LE(method, AuthMethod::kMaxValue);
+  UMA_HISTOGRAM_ENUMERATION("NativeSmbFileShare.AuthenticationMethod", method);
+}
+
 std::unique_ptr<TempFileManager> CreateTempFileManager() {
   return std::make_unique<TempFileManager>();
 }
@@ -109,10 +127,12 @@
                        const base::FilePath& share_path,
                        const std::string& username,
                        const std::string& password,
+                       bool use_chromad_kerberos,
                        MountResponse callback) {
   DCHECK(temp_file_manager_);
 
-  CallMount(options, share_path, username, password, std::move(callback));
+  CallMount(options, share_path, username, password, use_chromad_kerberos,
+            std::move(callback));
 }
 
 void SmbService::GatherSharesInNetwork(HostDiscoveryResponse discovery_callback,
@@ -125,26 +145,34 @@
                            const base::FilePath& share_path,
                            const std::string& username_input,
                            const std::string& password_input,
+                           bool use_chromad_kerberos,
                            MountResponse callback) {
   std::string username;
   std::string password;
   std::string workgroup;
 
-  bool is_kerberos_chromad = false;
-
-  if (username_input.empty()) {
-    // If no credentials were provided and the user is ChromAD, pass the users
-    // username and workgroup for their email address to be used for Kerberos
-    // authentication.
+  if (use_chromad_kerberos) {
+    RecordAuthenticationMethod(AuthMethod::kSSOKerberos);
+    // Get the user's username and workgroup from their email address to be used
+    // for Kerberos authentication.
     user_manager::User* user =
         chromeos::ProfileHelper::Get()->GetUserByProfile(profile_);
-    if (user && user->IsActiveDirectoryUser()) {
+    if (user) {
+      DCHECK(user->IsActiveDirectoryUser());
       ParseUserPrincipalName(user->GetDisplayEmail(), &username, &workgroup);
-      is_kerberos_chromad = true;
     }
   } else {
-    // Credentials were provided so use them and parse the username into
-    // username and workgroup if neccessary.
+    // Record authentication method metrics.
+    if (!username_input.empty() && !password_input.empty()) {
+      RecordAuthenticationMethod(AuthMethod::kUsernameAndPassword);
+    } else if (!username_input.empty()) {
+      RecordAuthenticationMethod(AuthMethod::kUsernameOnly);
+    } else {
+      RecordAuthenticationMethod(AuthMethod::kNoCredentials);
+    }
+
+    // Use provided credentials and parse the username into username and
+    // workgroup if necessary.
     username = username_input;
     password = password_input;
     if (ContainsAt(username)) {
@@ -165,7 +193,7 @@
       temp_file_manager_->WritePasswordToFile(password),
       base::BindOnce(&SmbService::OnMountResponse, AsWeakPtr(),
                      base::Passed(&callback), options, share_path,
-                     is_kerberos_chromad));
+                     use_chromad_kerberos));
 }
 
 void SmbService::OnMountResponse(
diff --git a/chrome/browser/chromeos/smb_client/smb_service.h b/chrome/browser/chromeos/smb_client/smb_service.h
index 04e0a7732..f4f7e66 100644
--- a/chrome/browser/chromeos/smb_client/smb_service.h
+++ b/chrome/browser/chromeos/smb_client/smb_service.h
@@ -54,11 +54,14 @@
   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
   // Starts the process of mounting an SMB file system.
+  // |use_kerberos| indicates whether the share should be mounted with a user's
+  // chromad kerberos tickets.
   // Calls SmbProviderClient::Mount().
   void Mount(const file_system_provider::MountOptions& options,
              const base::FilePath& share_path,
              const std::string& username,
              const std::string& password,
+             bool use_chromad_kerberos,
              MountResponse callback);
 
   // Completes the mounting of an SMB file system, passing |options| on to
@@ -85,6 +88,7 @@
                  const base::FilePath& share_path,
                  const std::string& username,
                  const std::string& password,
+                 bool use_chromad_kerberos,
                  MountResponse callback);
 
   // Calls file_system_provider::Service::UnmountFileSystem().
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
index a202620..aa24356 100644
--- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
+++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.cc
@@ -11,7 +11,6 @@
 #include "base/feature_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/data_use_measurement/chrome_data_use_recorder.h"
-#include "chrome/browser/data_use_measurement/page_load_capping/chrome_page_load_capping_features.h"
 #include "components/data_use_measurement/content/content_url_request_classifier.h"
 #include "components/data_use_measurement/core/data_use_recorder.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
@@ -25,8 +24,10 @@
 
 namespace data_use_measurement {
 
+// This flag allows us to enable ChromeDataUseAscriber for data saver users
+// using Finch. The default is to disable ChromeDataUseAscriber.
 const base::Feature kDisableAscriberIfDataSaverDisabled{
-    "DisableAscriberIfDataSaverDisabled", base::FEATURE_DISABLED_BY_DEFAULT};
+    "DisableAscriberIfDataSaverDisabled", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // static
 const void* const ChromeDataUseAscriber::DataUseRecorderEntryAsUserData::
@@ -650,8 +651,8 @@
 bool ChromeDataUseAscriber::IsDisabled() const {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
-  // TODO(rajendrant): https://crbug.com/753559. Fix platform specific race
-  // conditions and re-enable.
+  // TODO(rajendrant): Disable and deprecate the ChromeDataUseAscriber
+  // altogether.
   return base::FeatureList::IsEnabled(kDisableAscriberIfDataSaverDisabled) &&
          disable_ascriber_;
 }
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.h b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.h
index 23db643..ca04f16a 100644
--- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber.h
+++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber.h
@@ -223,9 +223,9 @@
   // Detects heavy pages. Can be null when the feature is disabled.
   std::unique_ptr<DataUseAscriber::PageLoadObserver> page_capping_observer_;
 
-  // True if the dtaa use ascriber should be disabled. The ascriber is enabled
+  // True if the data use ascriber should be disabled. The ascriber is disabled
   // by default.
-  bool disable_ascriber_ = false;
+  bool disable_ascriber_ = true;
 
   // Set of requests that are currently in-flight.
   std::unordered_set<const net::URLRequest*> requests_;
diff --git a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc
index fa2b530..0a2e0ff 100644
--- a/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc
+++ b/chrome/browser/data_use_measurement/chrome_data_use_ascriber_unittest.cc
@@ -62,6 +62,8 @@
 
   void CreateAscriber() {
     ascriber_ = std::make_unique<ChromeDataUseAscriber>();
+    // Enable ascriber for tests.
+    ascriber_->disable_ascriber_ = false;
   }
 
   std::list<ChromeDataUseRecorder>& recorders() {
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc
index d26d6655..0f3f535 100644
--- a/chrome/browser/media/encrypted_media_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -646,9 +646,28 @@
 }
 
 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, PolicyCheck) {
+  // There is no need to run this test twice for the same key system.
+  if (CurrentSourceType() != SrcType::MSE) {
+    DVLOG(0) << "Skipping test.";
+    return;
+  }
+
   TestPolicyCheck();
 }
 
+IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, RemoveTemporarySession) {
+  // Although this test doesn't play anything, there is no need to run it
+  // twice for the same key system.
+  if (CurrentSourceType() != SrcType::MSE) {
+    DVLOG(0) << "Skipping test.";
+    return;
+  }
+
+  base::StringPairs query_params{{"keySystem", CurrentKeySystem()}};
+  RunEncryptedMediaTestPage("eme_remove_session_test.html", CurrentKeySystem(),
+                            query_params, media::kEnded);
+}
+
 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, EncryptedMediaDisabled) {
   DisableEncryptedMedia();
 
diff --git a/chrome/browser/offline_pages/thumbnail_decoder_impl.h b/chrome/browser/offline_pages/thumbnail_decoder_impl.h
index 577fde8..69c9092 100644
--- a/chrome/browser/offline_pages/thumbnail_decoder_impl.h
+++ b/chrome/browser/offline_pages/thumbnail_decoder_impl.h
@@ -12,6 +12,10 @@
 
 namespace offline_pages {
 
+// Decodes the downloaded JPEG image, crops it and re-encode it as a PNG
+// file to be used as the thumbnail of an offlined suggested article.
+// Note: the local decoding in a separate process and local re-encoding as a PNG
+// are important security measures as these downloaded images are web content.
 class ThumbnailDecoderImpl : public ThumbnailDecoder {
  public:
   explicit ThumbnailDecoderImpl(
diff --git a/chrome/browser/password_manager/password_accessory_controller.cc b/chrome/browser/password_manager/password_accessory_controller.cc
index a28f9049..0bb11d7 100644
--- a/chrome/browser/password_manager/password_accessory_controller.cc
+++ b/chrome/browser/password_manager/password_accessory_controller.cc
@@ -22,6 +22,7 @@
 #include "components/autofill/core/common/password_form.h"
 #include "components/autofill/core/common/password_generation_util.h"
 #include "components/favicon/core/favicon_service.h"
+#include "components/favicon_base/favicon_types.h"
 #include "components/password_manager/content/browser/content_password_manager_driver.h"
 #include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
 #include "components/password_manager/core/browser/password_manager_driver.h"
@@ -264,6 +265,7 @@
 }
 
 void PasswordAccessoryController::GetFavicon(
+    int desired_size_in_pixel,
     base::OnceCallback<void(const gfx::Image&)> icon_callback) {
   url::Origin origin = current_origin_;  // Copy origin in case it changes.
   // Check whether this request can be immediately answered with a cached icon.
@@ -283,8 +285,10 @@
   if (icon_request->pending_requests.size() > 1)
     return;  // The favicon for this origin was already requested.
 
-  favicon_service_->GetFaviconImageForPageURL(
-      origin.GetURL(),
+  favicon_service_->GetRawFaviconForPageURL(
+      origin.GetURL(), {favicon_base::IconType::kFavicon},
+      desired_size_in_pixel,
+      /* fallback_to_host = */ false,
       base::BindRepeating(  // FaviconService doesn't support BindOnce yet.
           &PasswordAccessoryController::OnImageFetched,
           weak_factory_.GetWeakPtr(), origin),
@@ -417,8 +421,14 @@
 
 void PasswordAccessoryController::OnImageFetched(
     url::Origin origin,
-    const favicon_base::FaviconImageResult& image_result) {
+    const favicon_base::FaviconRawBitmapResult& bitmap_result) {
   FaviconRequestData* icon_request = &icons_request_data_[origin];
+
+  favicon_base::FaviconImageResult image_result;
+  if (bitmap_result.is_valid()) {
+    image_result.image = gfx::Image::CreateFrom1xPNGBytes(
+        bitmap_result.bitmap_data->front(), bitmap_result.bitmap_data->size());
+  }
   icon_request->cached_icon = image_result.image;
   // Only trigger all the callbacks if they still affect a displayed origin.
   if (origin == current_origin_) {
diff --git a/chrome/browser/password_manager/password_accessory_controller.h b/chrome/browser/password_manager/password_accessory_controller.h
index 9d164ae..c1b3b49 100644
--- a/chrome/browser/password_manager/password_accessory_controller.h
+++ b/chrome/browser/password_manager/password_accessory_controller.h
@@ -110,7 +110,8 @@
   // frame. The given callback is called with an image unless an icon for a new
   // origin was called. In the latter case, the callback is dropped.
   // The callback is called with an |IsEmpty()| image if there is no favicon.
-  void GetFavicon(base::OnceCallback<void(const gfx::Image&)> icon_callback);
+  void GetFavicon(int desired_size_in_pixel,
+                  base::OnceCallback<void(const gfx::Image&)> icon_callback);
 
   // Called by the UI code to request that |textToFill| is to be filled into the
   // currently focused field.
@@ -186,8 +187,9 @@
 
   // Handles a favicon response requested by |GetFavicon| and calls the waiting
   // last_icon_callback_ with a (possibly empty) icon bitmap.
-  void OnImageFetched(url::Origin origin,
-                      const favicon_base::FaviconImageResult& image_result);
+  void OnImageFetched(
+      url::Origin origin,
+      const favicon_base::FaviconRawBitmapResult& bitmap_results);
 
   // Contains the last set of credentials by origin.
   std::map<url::Origin, std::vector<SuggestionElementData>> origin_suggestions_;
diff --git a/chrome/browser/password_manager/password_accessory_controller_unittest.cc b/chrome/browser/password_manager/password_accessory_controller_unittest.cc
index c5dd9c9..bc3aa18 100644
--- a/chrome/browser/password_manager/password_accessory_controller_unittest.cc
+++ b/chrome/browser/password_manager/password_accessory_controller_unittest.cc
@@ -31,6 +31,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/codec/png_codec.h"
 
 namespace {
 using autofill::FillingStatus;
@@ -54,6 +55,7 @@
 
 constexpr char kExampleSite[] = "https://example.com";
 constexpr char kExampleDomain[] = "example.com";
+constexpr int kIconSize = 75;  // An example size for favicons (=> 3.5*20px).
 
 // The mock view mocks the platform-specific implementation. That also means
 // that we have to care about the lifespan of the Controller because that would
@@ -675,11 +677,11 @@
       /*is_fillable=*/true,
       /*is_password_field=*/false);
 
-  EXPECT_CALL(*favicon_service(),
-              GetFaviconImageForPageURL(GURL(kExampleSite), _, _))
-      .WillOnce(favicon::PostReply<3>(favicon_base::FaviconImageResult()));
+  EXPECT_CALL(*favicon_service(), GetRawFaviconForPageURL(GURL(kExampleSite), _,
+                                                          kIconSize, _, _, _))
+      .WillOnce(favicon::PostReply<6>(favicon_base::FaviconRawBitmapResult()));
   EXPECT_CALL(mock_callback, Run);
-  controller()->GetFavicon(mock_callback.Get());
+  controller()->GetFavicon(kIconSize, mock_callback.Get());
   base::RunLoop().RunUntilIdle();
 }
 
@@ -692,16 +694,16 @@
       /*is_fillable=*/true,
       /*is_password_field=*/false);
 
-  EXPECT_CALL(*favicon_service(),
-              GetFaviconImageForPageURL(GURL(kExampleSite), _, _))
-      .WillOnce(favicon::PostReply<3>(favicon_base::FaviconImageResult()));
+  EXPECT_CALL(*favicon_service(), GetRawFaviconForPageURL(GURL(kExampleSite), _,
+                                                          kIconSize, _, _, _))
+      .WillOnce(favicon::PostReply<6>(favicon_base::FaviconRawBitmapResult()));
   EXPECT_CALL(mock_callback, Run).Times(2);
-  controller()->GetFavicon(mock_callback.Get());
+  controller()->GetFavicon(kIconSize, mock_callback.Get());
   // The favicon service should already start to work on the request.
   Mock::VerifyAndClearExpectations(favicon_service());
 
   // This call is only enqueued (and the callback will be called afterwards).
-  controller()->GetFavicon(mock_callback.Get());
+  controller()->GetFavicon(kIconSize, mock_callback.Get());
 
   // After the async task is finished, both callbacks must be called.
   base::RunLoop().RunUntilIdle();
@@ -711,10 +713,16 @@
   base::MockCallback<base::OnceCallback<void(const gfx::Image&)>> mock_callback;
 
   // We need a result with a non-empty image or it won't get cached.
-  favicon_base::FaviconImageResult non_empty_result;
+  favicon_base::FaviconRawBitmapResult non_empty_result;
   SkBitmap bitmap;
-  bitmap.allocN32Pixels(32, 32);
-  non_empty_result.image = gfx::Image::CreateFrom1xBitmap(bitmap);
+  bitmap.allocN32Pixels(kIconSize, kIconSize);
+  scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
+  gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data->data());
+  non_empty_result.bitmap_data = data;
+  non_empty_result.expired = false;
+  non_empty_result.pixel_size = gfx::Size(kIconSize, kIconSize);
+  non_empty_result.icon_type = favicon_base::IconType::kFavicon;
+  non_empty_result.icon_url = GURL(kExampleSite);
 
   // Populate the cache by requesting a favicon.
   EXPECT_CALL(*view(), OnItemsAvailable(_));
@@ -723,18 +731,18 @@
       /*is_fillable=*/true,
       /*is_password_field=*/false);
 
-  EXPECT_CALL(*favicon_service(),
-              GetFaviconImageForPageURL(GURL(kExampleSite), _, _))
-      .WillOnce(favicon::PostReply<3>(non_empty_result));
+  EXPECT_CALL(*favicon_service(), GetRawFaviconForPageURL(GURL(kExampleSite), _,
+                                                          kIconSize, _, _, _))
+      .WillOnce(favicon::PostReply<6>(non_empty_result));
   EXPECT_CALL(mock_callback, Run).Times(1);
-  controller()->GetFavicon(mock_callback.Get());
+  controller()->GetFavicon(kIconSize, mock_callback.Get());
 
   base::RunLoop().RunUntilIdle();
   Mock::VerifyAndClearExpectations(&mock_callback);
 
   // This call is handled by the cache - no favicon service, no async request.
   EXPECT_CALL(mock_callback, Run).Times(1);
-  controller()->GetFavicon(mock_callback.Get());
+  controller()->GetFavicon(kIconSize, mock_callback.Get());
   Mock::VerifyAndClearExpectations(&mock_callback);
   Mock::VerifyAndClearExpectations(favicon_service());
 
@@ -748,11 +756,11 @@
       url::Origin::Create(GURL(kExampleSite)), true, false);
 
   // The cache was cleared, so now the service has to be queried again.
-  EXPECT_CALL(*favicon_service(),
-              GetFaviconImageForPageURL(GURL(kExampleSite), _, _))
-      .WillOnce(favicon::PostReply<3>(non_empty_result));
+  EXPECT_CALL(*favicon_service(), GetRawFaviconForPageURL(GURL(kExampleSite), _,
+                                                          kIconSize, _, _, _))
+      .WillOnce(favicon::PostReply<6>(non_empty_result));
   EXPECT_CALL(mock_callback, Run).Times(1);
-  controller()->GetFavicon(mock_callback.Get());
+  controller()->GetFavicon(kIconSize, mock_callback.Get());
   base::RunLoop().RunUntilIdle();
 }
 
@@ -766,11 +774,11 @@
   // Right after starting the favicon request for example.com, another frame on
   // the same site is focused. Even if the request is completed, the callback
   // should not be called because the origin of the suggestions has changed.
-  EXPECT_CALL(*favicon_service(),
-              GetFaviconImageForPageURL(GURL(kExampleSite), _, _))
-      .WillOnce(favicon::PostReply<3>(favicon_base::FaviconImageResult()));
+  EXPECT_CALL(*favicon_service(), GetRawFaviconForPageURL(GURL(kExampleSite), _,
+                                                          kIconSize, _, _, _))
+      .WillOnce(favicon::PostReply<6>(favicon_base::FaviconRawBitmapResult()));
   EXPECT_CALL(mock_callback, Run).Times(0);
-  controller()->GetFavicon(mock_callback.Get());
+  controller()->GetFavicon(kIconSize, mock_callback.Get());
   controller()->RefreshSuggestionsForField(
       url::Origin::Create(GURL("https://other.frame.com/")), true, false);
 
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
index 2cab3d1..ee048cf 100644
--- a/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
+++ b/chrome/browser/picture_in_picture/picture_in_picture_window_controller_browsertest.cc
@@ -329,14 +329,8 @@
 
 // Tests that when an active WebContents accurately tracks whether a video
 // is in Picture-in-Picture.
-// Flaky failures on ChromeOS - http://crbug.com/892310
-#if defined(OS_CHROMEOS)
-#define MAYBE_TabIconUpdated DISABLED_TabIconUpdated
-#else
-#define MAYBE_TabIconUpdated TabIconUpdated
-#endif
 IN_PROC_BROWSER_TEST_F(PictureInPictureWindowControllerBrowserTest,
-                       MAYBE_TabIconUpdated) {
+                       TabIconUpdated) {
   GURL test_page_url = ui_test_utils::GetTestUrl(
       base::FilePath(base::FilePath::kCurrentDirectory),
       base::FilePath(
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
index b0fdb6a..8f8eeb8 100644
--- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
+++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
@@ -7,6 +7,7 @@
 <link rel="import" href="chrome://oobe/custom_elements.html">
 <link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
 <link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html">
+<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <!--
   UI for the MultiDevice setup flow when displayed after OOBE or during the
   user's first login on this Chromebook. Note that this flow is
@@ -32,7 +33,7 @@
       <oobe-text-button slot="backward-button">
         <div>[[backwardButtonText_]]</div>
       </oobe-text-button>
-      <oobe-next-button slot="forward-button"
+      <oobe-next-button id="next-button" slot="forward-button"
           disabled$="[[forwardButtonDisabled_]]">
         <div>[[forwardButtonText_]]</div>
       </oobe-next-button>
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
index 6d8748d..27ba0fd 100644
--- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
+++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
@@ -50,6 +50,8 @@
   const MultiDeviceSetupFirstRun = Polymer({
     is: 'multidevice-setup-first-run',
 
+    behaviors: [WebUIListenerBehavior],
+
     properties: {
       /** @private {!multidevice_setup.MultiDeviceSetupDelegate} */
       delegate_: Object,
@@ -85,6 +87,13 @@
     /** @override */
     attached: function() {
       this.delegate_ = new MultiDeviceSetupFirstRunDelegate();
+      this.addWebUIListener(
+          'multidevice_setup.initializeSetupFlow',
+          this.initializeSetupFlow.bind(this));
+    },
+
+    initializeSetupFlow: function() {
+      this.$$('#next-button').focus();
     },
 
     /** @private */
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog.css b/chrome/browser/resources/chromeos/login/oobe_dialog.css
index 7a24de2..a0e4fc3c 100644
--- a/chrome/browser/resources/chromeos/login/oobe_dialog.css
+++ b/chrome/browser/resources/chromeos/login/oobe_dialog.css
@@ -73,6 +73,10 @@
   padding: 0 calc(32px - 4px); /* real width - button margin */
 }
 
+:host #oobe-bottom[no-buttons-padding] {
+  padding: unset;
+}
+
 #oobe-bottom[android] {
   box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.14);
 }
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog.html b/chrome/browser/resources/chromeos/login/oobe_dialog.html
index 5b145a7..6363c8f 100644
--- a/chrome/browser/resources/chromeos/login/oobe_dialog.html
+++ b/chrome/browser/resources/chromeos/login/oobe_dialog.html
@@ -45,6 +45,7 @@
   Attributes:
     no-header - hides header
     no-footer-padding - disables footer padding.
+    no-buttons-padding - disables buttons padding.
     has-buttons - shows bottom buttons menu
 
   I.e. [no-header no-footer-padding] will make the footer occupy all the dialog
@@ -77,6 +78,7 @@
     </div>
     <template is="dom-if" if="[[hasButtons]]">
       <div id="oobe-bottom" hideShadow$="[[hideShadow]]" android$="[[android]]"
+        no-buttons-padding$="[[noButtonsPadding]]"
           class="layout horizontal center">
         <slot name="bottom-buttons"></slot>
       </div>
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog.js b/chrome/browser/resources/chromeos/login/oobe_dialog.js
index 16abac8d..7c6a5eed 100644
--- a/chrome/browser/resources/chromeos/login/oobe_dialog.js
+++ b/chrome/browser/resources/chromeos/login/oobe_dialog.js
@@ -39,6 +39,14 @@
     },
 
     /**
+     * Removes buttons padding.
+     */
+    noButtonsPadding: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
      * True when dialog is displayed in full-screen mode.
      */
     fullScreenDialog: {
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.css b/chrome/browser/resources/chromeos/login/screen_gaia_signin.css
index 56e30db8..7c3d1a5 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.css
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.css
@@ -136,10 +136,18 @@
   padding-top: 44px;
 }
 
-#signin-frame-dialog #navigation-buttons[disabled] {
-  background: rgba(0, 0, 0, 0.6);
+#signin-frame-dialog #buttons-container {
+  padding: 0 calc(32px - 4px); /* real width - button margin */
 }
 
-#navigation-buttons {
+#signin-frame-dialog[full-screen-dialog] #buttons-container {
+  padding: 0 calc(64px - 4px); /* real width - button margin */
+}
+
+#gaia-screen-navigation-buttons {
   height: 100%;
 }
+
+#gaia-screen-buttons-overlay {
+  background: rgba(0, 0, 0, 0.6);
+}
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
index 0514e1a..1df76621 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
@@ -3,15 +3,18 @@
 <div class="step right hidden no-logo" id="gaia-signin" role="group"
     aria-live="polite" hidden>
   <oobe-dialog id="signin-frame-dialog" class="gaia-dialog" role="dialog"
-      has-buttons no-header no-footer-padding hidden>
+      has-buttons no-header no-footer-padding no-buttons-padding hidden>
     <div id="signin-frame-container-v2" slot="footer"
         class="flex layout vertical">
     </div>
-    <div id="navigation-buttons"
-        slot="bottom-buttons" class="flex layout horizontal center">
-      <oobe-back-button id="signin-back-button"></oobe-back-button>
-      <div class="flex">
+    <div id="gaia-screen-navigation-buttons"
+        slot="bottom-buttons" class="relative flex layout horizontal center">
+      <div id="buttons-container" class="fit">
+        <oobe-back-button id="signin-back-button"></oobe-back-button>
+        <div class="flex">
+        </div>
       </div>
+      <div id="gaia-screen-buttons-overlay" class="fit" hidden></div>
     </div>
   </oobe-dialog>
   <div id="gaia-step-contents" class="step-contents">
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index 24b613e..b3912f1 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -600,9 +600,9 @@
       this.navigation_.disabled = value;
 
       if (value)
-        $('navigation-buttons').setAttribute('disabled', null);
+        $('gaia-screen-buttons-overlay').removeAttribute('hidden');
       else
-        $('navigation-buttons').removeAttribute('disabled');
+        $('gaia-screen-buttons-overlay').setAttribute('hidden', null);
 
       if ($('signin-back-button'))
         $('signin-back-button').disabled = value;
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
index 92081b2..f015be1 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
@@ -18,6 +18,7 @@
     </style>
     <multidevice-setup delegate="[[delegate_]]"
         on-setup-exited="onExitRequested_"
+        on-forward-button-focus-requested="onForwardButtonFocusRequested_"
         forward-button-text="{{forwardButtonText_}}"
         forward-button-disabled="{{forwardButtonDisabled_}}"
         backward-button-text="{{backwardButtonText_}}">
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
index 09b2a93..0cfe52b 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
@@ -44,10 +44,16 @@
   attached: function() {
     this.delegate_ = new multidevice_setup.PostOobeDelegate();
     this.$$('multidevice-setup').initializeSetupFlow();
+    this.onForwardButtonFocusRequested_();
   },
 
   /** @private */
   onExitRequested_: function() {
     chrome.send('dialogClose');
   },
+
+  /** @private */
+  onForwardButtonFocusRequested_: function() {
+    this.$$('#forward-button').focus();
+  }
 });
diff --git a/chrome/browser/resources/md_bookmarks/command_manager.js b/chrome/browser/resources/md_bookmarks/command_manager.js
index 2158633c..1956541 100644
--- a/chrome/browser/resources/md_bookmarks/command_manager.js
+++ b/chrome/browser/resources/md_bookmarks/command_manager.js
@@ -69,6 +69,9 @@
       this.addShortcut_(Command.OPEN_NEW_TAB, 'Ctrl|Enter', 'Meta|Enter');
       this.addShortcut_(Command.OPEN_NEW_WINDOW, 'Shift|Enter');
 
+      // Note: the undo shortcut is also defined in md_bookmarks_ui.cc
+      // TODO(b/893033): de-duplicate shortcut by moving all shortcut
+      // definitions from JS to C++.
       this.addShortcut_(Command.UNDO, 'Ctrl|z', 'Meta|z');
       this.addShortcut_(Command.REDO, 'Ctrl|y Ctrl|Shift|Z', 'Meta|Shift|Z');
 
diff --git a/chrome/browser/resources/md_bookmarks/toast_manager.html b/chrome/browser/resources/md_bookmarks/toast_manager.html
index 20cad6e..235917c 100644
--- a/chrome/browser/resources/md_bookmarks/toast_manager.html
+++ b/chrome/browser/resources/md_bookmarks/toast_manager.html
@@ -25,7 +25,10 @@
     </style>
     <cr-toast id="toast" duration="[[duration]]" role="alert">
       <div id="content" class="elided-text"></div>
-      <paper-button id="button" hidden$="[[!showUndo_]]" on-click="onUndoTap_">
+      <paper-button id="button"
+                    hidden$="[[!showUndo_]]"
+                    on-click="onUndoTap_"
+                    aria-label="$i18n{undoDescription}">
         $i18n{undo}
       </paper-button>
     </cr-toast>
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
index 5068766..768db16 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -335,8 +335,8 @@
     },
 
     /**
-     * The cast mode shown to the user. Initially set to auto mode. (See
-     * media_router.CastMode documentation for details on auto mode.)
+     * The cast mode shown to the user. Initially populated within
+     * |rebuildSinksToShow_()|.
      * This value may be changed in one of the following ways:
      * 1) The user explicitly selected a cast mode.
      * 2) The user selected cast mode is no longer available for the associated
@@ -348,10 +348,7 @@
      *    mode.
      * @private {number}
      */
-    shownCastModeValue_: {
-      type: Number,
-      value: media_router.AUTO_CAST_MODE.type,
-    },
+    shownCastModeValue_: Number,
 
     /**
      * Max height for the sink list.
diff --git a/chrome/browser/resources/media_router/elements/route_details/route_details.js b/chrome/browser/resources/media_router/elements/route_details/route_details.js
index 7152686..f1a32d0 100644
--- a/chrome/browser/resources/media_router/elements/route_details/route_details.js
+++ b/chrome/browser/resources/media_router/elements/route_details/route_details.js
@@ -99,6 +99,9 @@
    *     current route or the current route's sink.
    */
   computeCastButtonHidden_: function(route, changeRouteSourceAvailable) {
+    if (route === undefined || changeRouteSourceAvailable === undefined)
+      return false;
+
     return !((route && route.canJoin) || changeRouteSourceAvailable);
   },
 
diff --git a/chrome/browser/resources/media_router/media_router_common.css b/chrome/browser/resources/media_router/media_router_common.css
index 3006f99..030af36c 100644
--- a/chrome/browser/resources/media_router/media_router_common.css
+++ b/chrome/browser/resources/media_router/media_router_common.css
@@ -2,7 +2,7 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
-:root {
+:host > * {
   --dialog-padding-end: 26px;
   --dialog-padding-start: 16px;
   --dialog-width: 340px;
diff --git a/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.html b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.html
index 5a70d93..8c30c6d 100644
--- a/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.html
+++ b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.html
@@ -47,7 +47,7 @@
       <div slot="body" spellcheck="false">
         <cr-searchable-drop-down id="address" label="$i18n{smbShareUrl}"
             value="{{mountUrl_}}" items="[[discoveredShares_]]"
-            placeholder="\\server\share"
+            placeholder="\\server\share" on-change="onURLChanged_"
             update-value-on-input autofocus>
         </cr-searchable-drop-down>
         <cr-input id="name" label="$i18n{smbShareName}" value="{{mountName_}}"
diff --git a/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.js b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.js
index bdda96b..bed31c98 100644
--- a/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.js
+++ b/chrome/browser/resources/settings/downloads_page/add_smb_share_dialog.js
@@ -7,12 +7,6 @@
  * an SMB Share.
  */
 
-/** @enum {string} */
-settings.SmbAuthMethod = {
-  KERBEROS: 'kerberos',
-  CREDENTIALS: 'credentials',
-};
-
 Polymer({
   is: 'settings-add-smb-share-dialog',
 
@@ -63,8 +57,8 @@
       type: String,
       value: function() {
         return loadTimeData.getBoolean('isActiveDirectoryUser') ?
-            settings.SmbAuthMethod.KERBEROS :
-            settings.SmbAuthMethod.CREDENTIALS;
+            SmbAuthMethod.KERBEROS :
+            SmbAuthMethod.CREDENTIALS;
       },
     },
   },
@@ -93,10 +87,17 @@
   /** @private */
   onAddButtonTap_: function() {
     this.browserProxy_.smbMount(
-        this.mountUrl_, this.mountName_.trim(), this.username_, this.password_);
+        this.mountUrl_, this.mountName_.trim(), this.username_, this.password_,
+        this.authenticationMethod_);
     this.$.dialog.close();
   },
 
+  /** @private */
+  onURLChanged_: function() {
+    const parts = this.mountUrl_.split('\\');
+    this.mountName_ = parts[parts.length - 1];
+  },
+
   /**
    * @return {boolean}
    * @private
@@ -118,6 +119,6 @@
    * @private
    */
   shouldShowCredentialUI_: function() {
-    return this.authenticationMethod_ == settings.SmbAuthMethod.CREDENTIALS;
+    return this.authenticationMethod_ == SmbAuthMethod.CREDENTIALS;
   },
 });
diff --git a/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.js b/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.js
index 5085ce6..59ca15f 100644
--- a/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.js
+++ b/chrome/browser/resources/settings/downloads_page/smb_browser_proxy.js
@@ -22,6 +22,12 @@
   INVALID_URL: 6,
 };
 
+/** @enum {string} */
+const SmbAuthMethod = {
+  KERBEROS: 'kerberos',
+  CREDENTIALS: 'credentials',
+};
+
 cr.define('settings', function() {
   /** @interface */
   class SmbBrowserProxy {
@@ -31,8 +37,9 @@
      * @param {string} smbName Display name for the File Share.
      * @param {string} username
      * @param {string} password
+     * @param {string} authMethod
      */
-    smbMount(smbUrl, smbName, username, password) {}
+    smbMount(smbUrl, smbName, username, password, authMethod) {}
 
     /**
      * Starts the file share discovery process.
@@ -43,8 +50,11 @@
   /** @implements {settings.SmbBrowserProxy} */
   class SmbBrowserProxyImpl {
     /** @override */
-    smbMount(smbUrl, smbName, username, password) {
-      chrome.send('smbMount', [smbUrl, smbName, username, password]);
+    smbMount(smbUrl, smbName, username, password, authMethod) {
+      chrome.send('smbMount', [
+        smbUrl, smbName, username, password,
+        authMethod == SmbAuthMethod.KERBEROS
+      ]);
     }
 
     /** @override */
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.js b/chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.js
index 387fed2..187bd43 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.js
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_browser_proxy.js
@@ -37,6 +37,15 @@
      * @return {!Promise<boolean>}
      */
     getSmartLockSignInEnabled() {}
+
+    /**
+     * Sets the value of the preference controlling whether Smart Lock may be
+     * used to sign-in the user (as opposed to unlocking the screen).
+     * @param {boolean} enabled
+     * @param {string=} opt_authToken Authentication token used to restrict
+     *    edit access to the Smart Lock sign-in pref.
+     */
+    setSmartLockSignInEnabled(enabled, opt_authToken) {}
   }
 
   /**
@@ -78,6 +87,11 @@
     getSmartLockSignInEnabled() {
       return cr.sendWithPromise('getSmartLockSignInEnabled');
     }
+
+    /** @override */
+    setSmartLockSignInEnabled(enabled, opt_authToken) {
+      chrome.send('setSmartLockSignInEnabled', [enabled, opt_authToken]);
+    }
   }
 
   cr.addSingletonGetter(MultiDeviceBrowserProxyImpl);
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.html b/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.html
index ad3c6d9..2fed2a02 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.html
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.html
@@ -37,7 +37,9 @@
       <div class="list-frame">
         <paper-radio-group
             selected="[[smartLockSignInEnabled_]]"
-            selectable="cr-radio-button">
+            selectable="cr-radio-button"
+            on-paper-radio-group-changed=
+                    "onSmartLockSignInEnabledChanged_">
           <cr-radio-button
               name="disabled"
               class="list-item underbar"
@@ -51,6 +53,9 @@
         </paper-radio-group>
       </div>
     </iron-collapse>
+    <template is="dom-if" if="[[showPasswordPromptDialog_]]" restamp>
+      <settings-password-prompt-dialog></settings-password-prompt-dialog>
+    </template>
   </template>
   <script src="multidevice_smartlock_subpage.js"></script>
 </dom-module>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.js b/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.js
index d3e4fc2..dcaa7df 100644
--- a/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.js
+++ b/chrome/browser/resources/settings/multidevice_page/multidevice_smartlock_subpage.js
@@ -61,6 +61,17 @@
       type: Object,
       value: settings.SignInEnabledState.DISABLED,
     },
+
+    /** @private */
+    showPasswordPromptDialog_: {
+      type: Boolean,
+      value: false,
+    },
+  },
+
+  listeners: {
+    'auth-token-changed': 'onAuthTokenChanged_',
+    'close': 'onDialogClose_',
   },
 
   /** @private {?settings.MultiDeviceBrowserProxy} */
@@ -99,4 +110,57 @@
         settings.SignInEnabledState.ENABLED :
         settings.SignInEnabledState.DISABLED;
   },
+
+  /** @private */
+  openPasswordPromptDialog_: function() {
+    this.showPasswordPromptDialog_ = true;
+  },
+
+  /**
+   * Sets the Smart Lock 'sign-in enabled' pref based on the value of the
+   * radio group representing the pref.
+   * @private
+   */
+  onSmartLockSignInEnabledChanged_: function(event) {
+    const radioGroup = event.target;
+    const enabled = radioGroup.selected == settings.SignInEnabledState.ENABLED;
+
+    if (!enabled) {
+      // No authentication check is required to disable.
+      this.browserProxy_.setSmartLockSignInEnabled(false /* enabled */);
+      return;
+    }
+
+    // Toggle the enabled state back to disabled, as authentication may not
+    // succeed. The toggle state updates automatically by the pref listener.
+    radioGroup.selected = settings.SignInEnabledState.DISABLED;
+    this.openPasswordPromptDialog_();
+  },
+
+  /**
+   * Completes the transaction of setting the Smart Lock 'sign-in enabled' pref
+   * after the user authenticates.
+   * @param {!{detail: !Object}} event The event containing the auth token.
+   * @private
+   */
+  onAuthTokenChanged_: function(event) {
+    const authToken = event.detail.value;
+
+    // The auth-token-changed event fires after the expiration period (
+    // represented by the empty string), so only move forward when the auth
+    // token is non-empty.
+    if (authToken !== '') {
+      this.browserProxy_.setSmartLockSignInEnabled(
+          true /* enabled */, authToken);
+    }
+  },
+
+  /**
+   * Updates the state of the password dialog controller flag when the UI
+   * element closes.
+   * @private
+   */
+  onDialogClose_: function() {
+    this.showPasswordPromptDialog_ = false;
+  },
 });
diff --git a/chrome/browser/resources/settings/site_settings/site_data_details_subpage.html b/chrome/browser/resources/settings/site_settings/site_data_details_subpage.html
index db294a8..5a4c641e 100644
--- a/chrome/browser/resources/settings/site_settings/site_data_details_subpage.html
+++ b/chrome/browser/resources/settings/site_settings/site_data_details_subpage.html
@@ -19,7 +19,7 @@
       .secondary,
       .start {
         max-width: 100%;
-        word-wrap: break-word;
+        word-break: break-word;
       }
     </style>
     <template is="dom-repeat" items="[[entries_]]">
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/.eslintrc.js b/chrome/browser/resources/welcome/onboarding_welcome/.eslintrc.js
new file mode 100644
index 0000000..25e21f9
--- /dev/null
+++ b/chrome/browser/resources/welcome/onboarding_welcome/.eslintrc.js
@@ -0,0 +1,13 @@
+// Copyright 2018 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.
+
+module.exports = {
+  'env': {
+    'browser': true,
+    'es6': true,
+  },
+  'rules': {
+    'no-var': 'error',
+  },
+};
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
index be613f7..979cc8651 100644
--- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
+++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
@@ -188,9 +188,6 @@
   if (!features::IsMultiProcessMash()) {
     ash_shell_init_ = std::make_unique<AshShellInit>();
   } else {
-    // TODO(jamescook): Sort out whether to use ImmersiveContextAsh or
-    // ImmersiveContextMus in SingleProcessMash.
-    immersive_context_ = std::make_unique<ImmersiveContextMus>();
     immersive_handler_factory_ = std::make_unique<ImmersiveHandlerFactoryMus>();
 
     // Enterprise support in the browser can monitor user activity. Connect to
@@ -206,6 +203,9 @@
         std::move(user_activity_monitor), user_activity_detector_.get());
   }
 
+  if (features::IsUsingWindowService())
+    immersive_context_ = std::make_unique<ImmersiveContextMus>();
+
   // TODO(estade): implement ScreenOrientationDelegateChromeos for Mash and
   // remove this condition.
   if (!features::IsUsingWindowService()) {
diff --git a/chrome/browser/ui/views/frame/DEPS b/chrome/browser/ui/views/frame/DEPS
index 39901e3f..21c51f9 100644
--- a/chrome/browser/ui/views/frame/DEPS
+++ b/chrome/browser/ui/views/frame/DEPS
@@ -6,6 +6,10 @@
   "browser_frame_ash\.*": [
     "+ash",
   ],
+  # Shell is used only in classic Ash.
+  "immersive_mode_controller_ash.cc": [
+    "+ash/shell.h",
+  ],
   "top_controls_slide_controller_chromeos_browsertest.cc": [
     "+cc/base/math_util.h",
   ],
diff --git a/chrome/browser/ui/views/frame/browser_frame_mash.cc b/chrome/browser/ui/views/frame/browser_frame_mash.cc
index 15f9be8..ec04a202 100644
--- a/chrome/browser/ui/views/frame/browser_frame_mash.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_mash.cc
@@ -56,12 +56,12 @@
   chrome::GetSavedWindowBoundsAndShowState(browser_view_->browser(),
                                            &params.bounds, &params.show_state);
   params.delegate = browser_view_;
-  std::map<std::string, std::vector<uint8_t>> properties =
-      views::MusClient::ConfigurePropertiesFromParams(params);
-
   // The client will draw the frame.
   params.remove_standard_frame = true;
 
+  std::map<std::string, std::vector<uint8_t>> properties =
+      views::MusClient::ConfigurePropertiesFromParams(params);
+
   // ChromeLauncherController manages the browser shortcut shelf item; set the
   // window's shelf item type property to be ignored by ash::ShelfWindowWatcher.
   properties[ws::mojom::WindowManager::kShelfItemType_Property] =
diff --git a/chrome/browser/ui/views/frame/immersive_context_mus.cc b/chrome/browser/ui/views/frame/immersive_context_mus.cc
index 81b95e9..bf8b166 100644
--- a/chrome/browser/ui/views/frame/immersive_context_mus.cc
+++ b/chrome/browser/ui/views/frame/immersive_context_mus.cc
@@ -13,9 +13,18 @@
 #include "ui/views/pointer_watcher.h"
 #include "ui/views/widget/desktop_aura/desktop_capture_client.h"
 
-ImmersiveContextMus::ImmersiveContextMus() {}
+// static
+ImmersiveContextMus* ImmersiveContextMus::instance_ = nullptr;
 
-ImmersiveContextMus::~ImmersiveContextMus() {}
+ImmersiveContextMus::ImmersiveContextMus() {
+  DCHECK(!instance_);
+  instance_ = this;
+}
+
+ImmersiveContextMus::~ImmersiveContextMus() {
+  DCHECK_EQ(instance_, this);
+  instance_ = nullptr;
+}
 
 void ImmersiveContextMus::OnEnteringOrExitingImmersive(
     ash::ImmersiveFullscreenController* controller,
diff --git a/chrome/browser/ui/views/frame/immersive_context_mus.h b/chrome/browser/ui/views/frame/immersive_context_mus.h
index 25cc9f5..fef4bcc 100644
--- a/chrome/browser/ui/views/frame/immersive_context_mus.h
+++ b/chrome/browser/ui/views/frame/immersive_context_mus.h
@@ -13,6 +13,8 @@
   ImmersiveContextMus();
   ~ImmersiveContextMus() override;
 
+  static ImmersiveContextMus* Get() { return instance_; }
+
   // ash::ImmersiveContext:
   void OnEnteringOrExitingImmersive(
       ash::ImmersiveFullscreenController* controller,
@@ -25,6 +27,8 @@
   bool IsMouseEventsEnabled() override;
 
  private:
+  static ImmersiveContextMus* instance_;
+
   DISALLOW_COPY_AND_ASSIGN(ImmersiveContextMus);
 };
 
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
index b618d81..2482b2a 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
@@ -7,12 +7,14 @@
 #include "ash/public/cpp/immersive/immersive_revealed_lock.h"
 #include "ash/public/cpp/window_properties.h"
 #include "ash/public/interfaces/window_state_type.mojom.h"
+#include "ash/shell.h"  // mash-ok
 #include "base/macros.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/ui/ash/tablet_mode_client.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/frame/immersive_context_mus.h"
 #include "chrome/browser/ui/views/frame/top_container_view.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "content/public/browser/notification_service.h"
@@ -102,7 +104,10 @@
 
 ImmersiveModeControllerAsh::ImmersiveModeControllerAsh()
     : ImmersiveModeController(Type::ASH),
-      controller_(new ash::ImmersiveFullscreenController),
+      controller_(std::make_unique<ash::ImmersiveFullscreenController>(
+          features::IsUsingWindowService()
+              ? ImmersiveContextMus::Get()
+              : ash::Shell::Get()->immersive_context())),
       event_rewriter_(std::make_unique<LocatedEventRetargeter>()) {}
 
 ImmersiveModeControllerAsh::~ImmersiveModeControllerAsh() = default;
diff --git a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
index 7ad9a51..b6e1160 100644
--- a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
+++ b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
@@ -18,6 +18,10 @@
 
   // DialogBrowserTest:
   void ShowUi(const std::string& name) override {
+    // Web modal dialogs' bounds may exceed the display's work area.
+    // https://crbug.com/893292.
+    set_should_verify_dialog_bounds(false);
+
     auto model = std::make_unique<AuthenticatorRequestDialogModel>();
     ::device::FidoRequestHandlerBase::TransportAvailabilityInfo
         transport_availability;
diff --git a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
index 0d04216..fb86a45 100644
--- a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
@@ -35,8 +35,8 @@
 
 void MultiDeviceSetupScreenHandler::Show() {
   AllowJavascript();
-  FireWebUIListener("multidevice_setup.initializeSetupFlow");
   ShowScreen(kScreenId);
+  FireWebUIListener("multidevice_setup.initializeSetupFlow");
 }
 
 void MultiDeviceSetupScreenHandler::Hide() {}
diff --git a/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc b/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
index 1dbcf03..fea64cc 100644
--- a/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
+++ b/chrome/browser/ui/webui/md_bookmarks/md_bookmarks_ui.cc
@@ -24,6 +24,7 @@
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "content/public/common/content_features.h"
+#include "ui/base/accelerators/accelerator.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 
@@ -41,6 +42,15 @@
   content::WebUIDataSource* source =
       content::WebUIDataSource::Create(chrome::kChromeUIBookmarksHost);
 
+  // Build an Accelerator to describe undo shortcut
+  // NOTE: the undo shortcut is also defined in md_bookmarks/command_manager.js
+  // TODO(b/893033): de-duplicate shortcut by moving all shortcut definitions
+  // from JS to C++.
+  ui::Accelerator undoAccelerator(ui::VKEY_Z, ui::EF_PLATFORM_ACCELERATOR);
+  source->AddString("undoDescription", l10n_util::GetStringFUTF16(
+                                           IDS_BOOKMARK_BAR_UNDO_DESCRIPTION,
+                                           undoAccelerator.GetShortcutText()));
+
   // Localized strings (alphabetical order).
   AddLocalizedString(source, "addBookmarkTitle",
                      IDS_MD_BOOKMARK_MANAGER_ADD_BOOKMARK_TITLE);
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
index 0548d8a..47ecd21 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
@@ -8,7 +8,10 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/values.h"
+#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_factory.h"
+#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_storage.h"
 #include "chrome/browser/chromeos/multidevice_setup/android_sms_app_helper_delegate_impl.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h"
 #include "chromeos/components/proximity_auth/logging/logging.h"
 #include "chromeos/components/proximity_auth/proximity_auth_pref_names.h"
@@ -83,6 +86,10 @@
       "getSmartLockSignInEnabled",
       base::BindRepeating(&MultideviceHandler::HandleGetSmartLockSignInEnabled,
                           base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "setSmartLockSignInEnabled",
+      base::BindRepeating(&MultideviceHandler::HandleSetSmartLockSignInEnabled,
+                          base::Unretained(this)));
 }
 
 void MultideviceHandler::OnJavascriptAllowed() {
@@ -191,8 +198,7 @@
 void MultideviceHandler::HandleGetSmartLockSignInEnabled(
     const base::ListValue* args) {
   std::string callback_id;
-  bool result = args->GetString(0, &callback_id);
-  DCHECK(result);
+  CHECK(args->GetString(0, &callback_id));
 
   bool signInEnabled = prefs_->GetBoolean(
       proximity_auth::prefs::kProximityAuthIsChromeOSLoginEnabled);
@@ -200,6 +206,26 @@
                             base::Value(signInEnabled));
 }
 
+void MultideviceHandler::HandleSetSmartLockSignInEnabled(
+    const base::ListValue* args) {
+  bool enabled = false;
+  CHECK(args->GetBoolean(0, &enabled));
+
+  std::string auth_token;
+  bool auth_token_present = args->GetString(1, &auth_token);
+
+  // Either the user is disabling sign-in, or they are enabling it and the auth
+  // token must be present.
+  CHECK(!enabled || auth_token_present);
+
+  // Only check auth token if the user is attempting to enable sign-in.
+  if (enabled && !IsAuthTokenValid(auth_token))
+    return;
+
+  prefs_->SetBoolean(
+      proximity_auth::prefs::kProximityAuthIsChromeOSLoginEnabled, enabled);
+}
+
 void MultideviceHandler::OnSetFeatureStateEnabledResult(
     const std::string& js_callback_id,
     bool success) {
@@ -261,6 +287,14 @@
                     base::Value(sign_in_enabled));
 }
 
+bool MultideviceHandler::IsAuthTokenValid(const std::string& auth_token) {
+  Profile* profile = Profile::FromWebUI(web_ui());
+  quick_unlock::QuickUnlockStorage* quick_unlock_storage =
+      chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(profile);
+  return !quick_unlock_storage->GetAuthTokenExpired() &&
+         auth_token == quick_unlock_storage->GetAuthToken();
+}
+
 }  // namespace settings
 
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h
index eecbb1a..3c9a1f9 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h
@@ -68,6 +68,7 @@
   void HandleRetryPendingHostSetup(const base::ListValue* args);
   void HandleSetUpAndroidSms(const base::ListValue* args);
   void HandleGetSmartLockSignInEnabled(const base::ListValue* args);
+  void HandleSetSmartLockSignInEnabled(const base::ListValue* args);
 
   void OnSetFeatureStateEnabledResult(const std::string& js_callback_id,
                                       bool success);
@@ -75,6 +76,10 @@
   void RegisterPrefChangeListeners();
   void NotifySmartLockSignInEnabledChanged();
 
+  // Returns true if |auth_token| matches the current auth token stored in
+  // QuickUnlockStorage, i.e., the user has successfully authenticated recently.
+  bool IsAuthTokenValid(const std::string& auth_token);
+
   // Unowned pointer to the preferences service.
   PrefService* prefs_;
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc b/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc
index 0f391a2e..fe49987 100644
--- a/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/smb_handler.cc
@@ -49,15 +49,17 @@
 }
 
 void SmbHandler::HandleSmbMount(const base::ListValue* args) {
-  CHECK_EQ(4U, args->GetSize());
+  CHECK_EQ(5U, args->GetSize());
   std::string mount_url;
   std::string mount_name;
   std::string username;
   std::string password;
+  bool use_kerberos;
   CHECK(args->GetString(0, &mount_url));
   CHECK(args->GetString(1, &mount_name));
   CHECK(args->GetString(2, &username));
   CHECK(args->GetString(3, &password));
+  CHECK(args->GetBoolean(4, &use_kerberos));
 
   smb_client::SmbService* const service = GetSmbService(profile_);
   if (!service) {
@@ -70,9 +72,10 @@
 
   auto mount_response = base::BindOnce(&SmbHandler::HandleSmbMountResponse,
                                        weak_ptr_factory_.GetWeakPtr());
-  auto mount_call = base::BindOnce(
-      &smb_client::SmbService::Mount, base::Unretained(service), mo,
-      base::FilePath(mount_url), username, password, std::move(mount_response));
+  auto mount_call =
+      base::BindOnce(&smb_client::SmbService::Mount, base::Unretained(service),
+                     mo, base::FilePath(mount_url), username, password,
+                     use_kerberos, std::move(mount_response));
 
   if (host_discovery_done_) {
     std::move(mount_call).Run();
diff --git a/chrome/browser/web_applications/extensions/BUILD.gn b/chrome/browser/web_applications/extensions/BUILD.gn
index a35c363..689ffbe 100644
--- a/chrome/browser/web_applications/extensions/BUILD.gn
+++ b/chrome/browser/web_applications/extensions/BUILD.gn
@@ -42,6 +42,9 @@
   testonly = true
 
   sources = [
+    # TODO(loyso): Extract it into web_applications_test_support set.
+    "../test/test_data_retriever.cc",
+    "../test/test_data_retriever.h",
     "bookmark_app_installation_task_unittest.cc",
     "bookmark_app_installer_unittest.cc",
     "pending_bookmark_app_manager_unittest.cc",
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
index 19e9265..37dae65 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/web_applications/components/web_app_data_retriever.h"
 #include "chrome/browser/web_applications/extensions/bookmark_app_installer.h"
 #include "chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h"
+#include "chrome/browser/web_applications/test/test_data_retriever.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
@@ -87,37 +88,6 @@
   DISALLOW_COPY_AND_ASSIGN(TestBookmarkAppHelper);
 };
 
-// All WebAppDataRetriever operations are async, so this class posts tasks
-// when running callbacks to simulate async behavior in tests as well.
-class TestDataRetriever : public web_app::WebAppDataRetriever {
- public:
-  explicit TestDataRetriever(std::unique_ptr<WebApplicationInfo> web_app_info)
-      : web_app_info_(std::move(web_app_info)) {}
-
-  ~TestDataRetriever() override = default;
-
-  void GetWebApplicationInfo(content::WebContents* web_contents,
-                             GetWebApplicationInfoCallback callback) override {
-    DCHECK(web_contents);
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindOnce(std::move(callback), std::move(web_app_info_)));
-  }
-
-  void GetIcons(const GURL& app_url,
-                const std::vector<GURL>& icon_urls,
-                GetIconsCallback callback) override {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(callback),
-                                  std::vector<WebApplicationInfo::IconInfo>()));
-  }
-
- private:
-  std::unique_ptr<WebApplicationInfo> web_app_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestDataRetriever);
-};
-
 class BookmarkAppInstallationTaskTest : public ChromeRenderViewHostTestHarness {
  public:
   BookmarkAppInstallationTaskTest() = default;
@@ -145,8 +115,9 @@
     WebApplicationInfo info;
     info.app_url = app_url;
     info.title = base::UTF8ToUTF16(kWebAppTitle);
-    task->SetDataRetrieverForTesting(std::make_unique<TestDataRetriever>(
-        std::make_unique<WebApplicationInfo>(std::move(info))));
+    task->SetDataRetrieverForTesting(
+        std::make_unique<web_app::TestDataRetriever>(
+            std::make_unique<WebApplicationInfo>(std::move(info))));
     task->SetBookmarkAppHelperFactoryForTesting(helper_factory());
   }
 
@@ -212,7 +183,7 @@
 TEST_F(BookmarkAppInstallationTaskTest, ShortcutFromContents_Delete) {
   auto task = std::make_unique<BookmarkAppShortcutInstallationTask>(profile());
   task->SetDataRetrieverForTesting(
-      std::make_unique<TestDataRetriever>(nullptr));
+      std::make_unique<web_app::TestDataRetriever>(nullptr));
 
   base::RunLoop run_loop;
   task->InstallFromWebContents(
@@ -228,7 +199,7 @@
 TEST_F(BookmarkAppInstallationTaskTest, ShortcutFromContents_NoWebAppInfo) {
   auto task = std::make_unique<BookmarkAppShortcutInstallationTask>(profile());
   task->SetDataRetrieverForTesting(
-      std::make_unique<TestDataRetriever>(nullptr));
+      std::make_unique<web_app::TestDataRetriever>(nullptr));
 
   base::RunLoop run_loop;
   task->InstallFromWebContents(
@@ -249,7 +220,7 @@
   WebApplicationInfo info;
   info.app_url = GURL(kWebAppUrl);
   info.title = base::UTF8ToUTF16(kWebAppTitle);
-  task->SetDataRetrieverForTesting(std::make_unique<TestDataRetriever>(
+  task->SetDataRetrieverForTesting(std::make_unique<web_app::TestDataRetriever>(
       std::make_unique<WebApplicationInfo>(std::move(info))));
 
   auto installer =
@@ -278,7 +249,7 @@
   WebApplicationInfo info;
   info.app_url = GURL(kWebAppUrl);
   info.title = base::UTF8ToUTF16(kWebAppTitle);
-  task->SetDataRetrieverForTesting(std::make_unique<TestDataRetriever>(
+  task->SetDataRetrieverForTesting(std::make_unique<web_app::TestDataRetriever>(
       std::make_unique<WebApplicationInfo>(std::move(info))));
   task->SetInstallerForTesting(
       std::make_unique<TestInstaller>(profile(), false /* succeeds */));
diff --git a/chrome/browser/web_applications/test/test_data_retriever.cc b/chrome/browser/web_applications/test/test_data_retriever.cc
new file mode 100644
index 0000000..8bc5252
--- /dev/null
+++ b/chrome/browser/web_applications/test/test_data_retriever.cc
@@ -0,0 +1,34 @@
+// Copyright 2018 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 "chrome/browser/web_applications/test/test_data_retriever.h"
+
+#include "base/logging.h"
+#include "chrome/common/web_application_info.h"
+
+namespace web_app {
+
+TestDataRetriever::TestDataRetriever(
+    std::unique_ptr<WebApplicationInfo> web_app_info)
+    : web_app_info_(std::move(web_app_info)) {}
+
+TestDataRetriever::~TestDataRetriever() = default;
+
+void TestDataRetriever::GetWebApplicationInfo(
+    content::WebContents* web_contents,
+    GetWebApplicationInfoCallback callback) {
+  DCHECK(web_contents);
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), std::move(web_app_info_)));
+}
+
+void TestDataRetriever::GetIcons(const GURL& app_url,
+                                 const std::vector<GURL>& icon_urls,
+                                 GetIconsCallback callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback),
+                                std::vector<WebApplicationInfo::IconInfo>()));
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/test/test_data_retriever.h b/chrome/browser/web_applications/test/test_data_retriever.h
new file mode 100644
index 0000000..43d1c30
--- /dev/null
+++ b/chrome/browser/web_applications/test/test_data_retriever.h
@@ -0,0 +1,39 @@
+// Copyright 2018 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 CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_DATA_RETRIEVER_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_DATA_RETRIEVER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "chrome/browser/web_applications/components/web_app_data_retriever.h"
+
+struct WebApplicationInfo;
+
+namespace web_app {
+
+// All WebAppDataRetriever operations are async, so this class posts tasks
+// when running callbacks to simulate async behavior in tests as well.
+class TestDataRetriever : public WebAppDataRetriever {
+ public:
+  explicit TestDataRetriever(std::unique_ptr<WebApplicationInfo> web_app_info);
+  ~TestDataRetriever() override;
+
+  void GetWebApplicationInfo(content::WebContents* web_contents,
+                             GetWebApplicationInfoCallback callback) override;
+
+  void GetIcons(const GURL& app_url,
+                const std::vector<GURL>& icon_urls,
+                GetIconsCallback callback) override;
+
+ private:
+  std::unique_ptr<WebApplicationInfo> web_app_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestDataRetriever);
+};
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_DATA_RETRIEVER_H_
diff --git a/chrome/child/BUILD.gn b/chrome/child/BUILD.gn
index 578cc25..36c7c93f 100644
--- a/chrome/child/BUILD.gn
+++ b/chrome/child/BUILD.gn
@@ -6,8 +6,8 @@
   sources = [
     "pdf_child_init.cc",
     "pdf_child_init.h",
-    "v8_breakpad_support_win.cc",
-    "v8_breakpad_support_win.h",
+    "v8_crashpad_support_win.cc",
+    "v8_crashpad_support_win.h",
   ]
 
   configs += [ "//build/config/compiler:wexit_time_destructors" ]
diff --git a/chrome/child/v8_breakpad_support_win.h b/chrome/child/v8_breakpad_support_win.h
deleted file mode 100644
index 5157980..0000000
--- a/chrome/child/v8_breakpad_support_win.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2014 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 CHROME_CHILD_V8_BREAKPAD_SUPPORT_WIN_H_
-#define CHROME_CHILD_V8_BREAKPAD_SUPPORT_WIN_H_
-
-namespace v8_breakpad_support {
-
-// Hook up V8 to breakpad.
-void SetUp();
-
-}  // namespace v8_breakpad_support
-
-#endif  // CHROME_CHILD_V8_BREAKPAD_SUPPORT_WIN_H_
diff --git a/chrome/child/v8_breakpad_support_win.cc b/chrome/child/v8_crashpad_support_win.cc
similarity index 84%
rename from chrome/child/v8_breakpad_support_win.cc
rename to chrome/child/v8_crashpad_support_win.cc
index 93530d1..c1c6c3a 100644
--- a/chrome/child/v8_breakpad_support_win.cc
+++ b/chrome/child/v8_crashpad_support_win.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 "chrome/child/v8_breakpad_support_win.h"
+#include "chrome/child/v8_crashpad_support_win.h"
 
 #include <windows.h>
 
@@ -12,7 +12,7 @@
 #include "components/crash/content/app/crash_export_thunks.h"
 #include "gin/public/debug.h"
 
-namespace v8_breakpad_support {
+namespace v8_crashpad_support {
 
 void SetUp() {
 #if defined(ARCH_CPU_X86_64)
@@ -23,4 +23,4 @@
 #endif
 }
 
-}  // namespace v8_breakpad_support
+}  // namespace v8_crashpad_support
diff --git a/chrome/child/v8_crashpad_support_win.h b/chrome/child/v8_crashpad_support_win.h
new file mode 100644
index 0000000..7e43232d
--- /dev/null
+++ b/chrome/child/v8_crashpad_support_win.h
@@ -0,0 +1,15 @@
+// Copyright (c) 2014 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 CHROME_CHILD_V8_CRASHPAD_SUPPORT_WIN_H_
+#define CHROME_CHILD_V8_CRASHPAD_SUPPORT_WIN_H_
+
+namespace v8_crashpad_support {
+
+// Hook up V8 to crashpad.
+void SetUp();
+
+}  // namespace v8_crashpad_support
+
+#endif  // CHROME_CHILD_V8_CRASHPAD_SUPPORT_WIN_H_
diff --git a/chrome/common/available_offline_content.mojom b/chrome/common/available_offline_content.mojom
index f6ac36e..b2a97e1 100644
--- a/chrome/common/available_offline_content.mojom
+++ b/chrome/common/available_offline_content.mojom
@@ -23,6 +23,9 @@
 };
 
 // A single piece of content that is available offline.
+// Note: Some of the content pieces stored in this struct are web content and
+// must be properly handled for securing their presentation on the net error
+// page.
 struct AvailableOfflineContent {
   // Together id and name_space define a unique ID for this item.
   string id;
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn
index 6b7652e2..69c488c 100644
--- a/chrome/test/android/BUILD.gn
+++ b/chrome/test/android/BUILD.gn
@@ -63,6 +63,7 @@
     "javatests/src/org/chromium/chrome/test/util/OverviewModeBehaviorWatcher.java",
     "javatests/src/org/chromium/chrome/test/util/PrerenderTestHelper.java",
     "javatests/src/org/chromium/chrome/test/util/RenderTestRule.java",
+    "javatests/src/org/chromium/chrome/test/util/SadTabRule.java",
     "javatests/src/org/chromium/chrome/test/util/TabStripUtils.java",
     "javatests/src/org/chromium/chrome/test/util/TranslateUtil.java",
   ]
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java
index 7d3295a3..690b7529 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java
@@ -88,7 +88,7 @@
         }
 
         @Override
-        public void onCrash(Tab tab, boolean sadTabShown) {
+        public void onCrash(Tab tab) {
             mCallback.notifyFailed("Tab crashed :(");
             tab.removeObserver(this);
         }
@@ -266,7 +266,7 @@
         }
 
         @Override
-        public void onCrash(Tab tab, boolean sadTabShown) {
+        public void onCrash(Tab tab) {
             mCallback.notifyFailed("Tab crashed :(");
             mTab.removeObserver(this);
         }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SadTabRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SadTabRule.java
new file mode 100644
index 0000000..5d28dc3
--- /dev/null
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SadTabRule.java
@@ -0,0 +1,65 @@
+// Copyright 2018 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.
+
+package org.chromium.chrome.test.util;
+
+import org.junit.rules.ExternalResource;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.chrome.browser.tab.SadTab;
+import org.chromium.chrome.browser.tab.Tab;
+
+/**
+ * Initialize a SadTab instance stubbed for facilitating tests.
+ */
+public class SadTabRule extends ExternalResource {
+    private Tab mTab;
+    private SadTab mSadTab;
+
+    @Override
+    protected void after() {
+        if (mSadTab != null) show(false);
+    }
+
+    public void setTab(Tab tab) {
+        mTab = tab;
+    }
+
+    /**
+     * Show or hide the stubbed SadTab. |SadTab.isShowing()| will return the status accordingly.
+     * @param show {@code true} to show sad tab on UI.
+     */
+    public void show(boolean show) {
+        assert mTab != null;
+
+        if (mSadTab == null) {
+            mSadTab = new SadTab(mTab) {
+                private boolean mShowing;
+
+                @Override
+                public void show() {
+                    mShowing = true;
+                }
+
+                @Override
+                public void removeIfPresent() {
+                    mShowing = false;
+                }
+
+                @Override
+                public boolean isShowing() {
+                    return mShowing;
+                }
+            };
+            ThreadUtils.runOnUiThreadBlocking(() -> SadTab.initForTesting(mTab, mSadTab));
+        }
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            if (show) {
+                mSadTab.show();
+            } else {
+                mSadTab.removeIfPresent();
+            }
+        });
+    }
+}
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java
index 9146971..fa55936 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/TabLoadObserver.java
@@ -55,7 +55,7 @@
     }
 
     @Override
-    public void onCrash(Tab tab, boolean sadTabShown) {
+    public void onCrash(Tab tab) {
         Assert.fail("Tab crashed; test results will be invalid.  Failing.");
     }
 
diff --git a/chrome/test/data/webui/media_router/media_router_container_filter_tests.js b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
index 1e5c881..b66fe80e 100644
--- a/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
@@ -85,6 +85,7 @@
       'key': 'Escape',
       'code': 'Escape',
       'bubbles': true,
+      'composed': true,
       'cancelable': true
     }));
   };
diff --git a/chrome/test/data/webui/media_router/media_router_container_test_base.js b/chrome/test/data/webui/media_router/media_router_container_test_base.js
index d9d997d..37eeb9c 100644
--- a/chrome/test/data/webui/media_router/media_router_container_test_base.js
+++ b/chrome/test/data/webui/media_router/media_router_container_test_base.js
@@ -26,12 +26,22 @@
      *     should be visible.
      */
     var checkElementsVisibleWithId = function(elementIdList) {
-      for (var i = 0; i < elementIdList.length; i++)
-        checkElementVisibleWithId(true, elementIdList[i]);
+      for (var id of elementIdList)
+        checkElementVisibleWithId(true, id);
 
-      for (var j = 0; j < hiddenCheckElementIdList.length; j++) {
-        if (elementIdList.indexOf(hiddenCheckElementIdList[j]) == -1)
-          checkElementVisibleWithId(false, hiddenCheckElementIdList[j]);
+      for (id of hiddenCheckElementIdList) {
+        if (!elementIdList.includes(id)) {
+          if (id === 'first-run-flow-cloud-pref' &&
+              !elementIdList.includes('first-run-flow')) {
+            // If 'first-run-flow' is already expected to be hidden, don't check
+            // first-run-flow-cloud-pref which is a child of it. Polymer2
+            // optimizes <dom-if>s that are false, by no longer updating its
+            // contents.
+            continue;
+          }
+
+          checkElementVisibleWithId(false, id);
+        }
       }
     };
 
diff --git a/chrome/test/data/webui/settings/smb_shares_page_tests.js b/chrome/test/data/webui/settings/smb_shares_page_tests.js
index 23fedf6..53ff7e72 100644
--- a/chrome/test/data/webui/settings/smb_shares_page_tests.js
+++ b/chrome/test/data/webui/settings/smb_shares_page_tests.js
@@ -12,8 +12,9 @@
   }
 
   /** @override */
-  smbMount(smbUrl, smbName, username, password) {
-    this.methodCalled('smbMount', [smbUrl, smbName, username, password]);
+  smbMount(smbUrl, smbName, username, password, authMethod) {
+    this.methodCalled(
+        'smbMount', [smbUrl, smbName, username, password, authMethod]);
   }
 
   /** @override */
@@ -71,6 +72,7 @@
     const expectedSmbName = 'testname';
     const expectedUsername = 'username';
     const expectedPassword = 'password';
+    const expectedAuthMethod = 'credentials';
 
     const url = addDialog.$$('#address');
     expectTrue(!!url);
@@ -91,12 +93,15 @@
     const addButton = addDialog.$$('.action-button');
     expectTrue(!!addButton);
 
+    addDialog.authenticationMethod_ = expectedAuthMethod;
+
     addButton.click();
     return smbBrowserProxy.whenCalled('smbMount').then(function(args) {
       expectEquals(expectedSmbUrl, args[0]);
       expectEquals(expectedSmbName, args[1]);
       expectEquals(expectedUsername, args[2]);
       expectEquals(expectedPassword, args[3]);
+      expectEquals(expectedAuthMethod, args[4]);
     });
   });
 
diff --git a/chrome/tools/build/linux/FILES.cfg b/chrome/tools/build/linux/FILES.cfg
index 165353c7..8106e3af 100644
--- a/chrome/tools/build/linux/FILES.cfg
+++ b/chrome/tools/build/linux/FILES.cfg
@@ -98,7 +98,7 @@
   },
   {
     'filename': 'libwidevinecdm.so',
-    'arch': ['32bit', '64bit'],
+    'arch': ['64bit'],
     'buildtype': ['official'],
     'direct_archive': 1,
   },
@@ -122,11 +122,6 @@
   },
   # Native Client plugin files:
   {
-    'filename': 'nacl_irt_x86_32.nexe',
-    'arch': ['32bit'],
-    'buildtype': ['dev', 'official'],
-  },
-  {
     'filename': 'nacl_irt_x86_64.nexe',
     'arch': ['64bit'],
     'buildtype': ['dev', 'official'],
@@ -167,22 +162,22 @@
   },
   # Breakpad symbols:
   {
-    'filename': 'chrome.breakpad.ia32',
-    'arch': ['32bit'],
-    'buildtype': ['official'],
-    'archive': 'breakpad-info.zip',
-  },
-  {
     'filename': 'chrome.breakpad.x64',
     'arch': ['64bit'],
     'buildtype': ['official'],
     'archive': 'breakpad-info.zip',
   },
   {
-    'filename': 'nacl_irt_x86_32.nexe.debug',
-    'arch': ['32bit'],
+    'filename': 'swiftshader_libegl.breakpad.x64',
+    'arch': ['64bit'],
     'buildtype': ['official'],
-    'archive': 'chrome-linux-nacl-irt-syms.zip',
+    'archive': 'breakpad-info.zip',
+  },
+  {
+    'filename': 'swiftshader_libgles.breakpad.x64',
+    'arch': ['64bit'],
+    'buildtype': ['official'],
+    'archive': 'breakpad-info.zip',
   },
   {
     'filename': 'nacl_irt_x86_64.nexe.debug',
diff --git a/chromeos/components/drivefs/drivefs_host.cc b/chromeos/components/drivefs/drivefs_host.cc
index 319138a..f26e345e 100644
--- a/chromeos/components/drivefs/drivefs_host.cc
+++ b/chromeos/components/drivefs/drivefs_host.cc
@@ -176,14 +176,14 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(host_->sequence_checker_);
     drivefs_has_mounted_ = false;
     drivefs_has_terminated_ = true;
-    host_->delegate_->OnMountFailed(std::move(remount_delay));
+    host_->mount_observer_->OnMountFailed(std::move(remount_delay));
   }
 
   void OnUnmounted(base::Optional<base::TimeDelta> remount_delay) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(host_->sequence_checker_);
     drivefs_has_mounted_ = false;
     drivefs_has_terminated_ = true;
-    host_->delegate_->OnUnmounted(std::move(remount_delay));
+    host_->mount_observer_->OnUnmounted(std::move(remount_delay));
   }
 
   void OnSyncingStatusUpdate(mojom::SyncingStatusPtr status) override {
@@ -216,9 +216,9 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(host_->sequence_checker_);
     if (!drivefs_has_terminated_) {
       if (mounted())
-        host_->delegate_->OnUnmounted({});
+        host_->mount_observer_->OnUnmounted({});
       else
-        host_->delegate_->OnMountFailed({});
+        host_->mount_observer_->OnMountFailed({});
       drivefs_has_terminated_ = true;
     }
   }
@@ -231,7 +231,7 @@
   void MaybeNotifyDelegateOnMounted() {
     if (mounted()) {
       host_->timer_->Stop();
-      host_->delegate_->OnMounted(mount_path());
+      host_->mount_observer_->OnMounted(mount_path());
     }
   }
 
@@ -296,7 +296,7 @@
       return;
     }
     if (error_code != chromeos::MOUNT_ERROR_NONE) {
-      host_->delegate_->OnMountFailed({});
+      host_->mount_observer_->OnMountFailed({});
       host_->Unmount();
       return;
     }
@@ -342,10 +342,14 @@
 
 DriveFsHost::DriveFsHost(const base::FilePath& profile_path,
                          DriveFsHost::Delegate* delegate,
+                         DriveFsHost::MountObserver* mount_observer,
                          std::unique_ptr<base::OneShotTimer> timer)
     : profile_path_(profile_path),
       delegate_(delegate),
+      mount_observer_(mount_observer),
       timer_(std::move(timer)) {
+  DCHECK(delegate_);
+  DCHECK(mount_observer_);
 }
 
 DriveFsHost::~DriveFsHost() {
diff --git a/chromeos/components/drivefs/drivefs_host.h b/chromeos/components/drivefs/drivefs_host.h
index 933cdeac..10e6e7ea3 100644
--- a/chromeos/components/drivefs/drivefs_host.h
+++ b/chromeos/components/drivefs/drivefs_host.h
@@ -51,6 +51,19 @@
     virtual void AcceptMojoConnection(base::ScopedFD handle) = 0;
   };
 
+  class MountObserver {
+   public:
+    MountObserver() = default;
+    virtual ~MountObserver() = default;
+    virtual void OnMounted(const base::FilePath& mount_path) = 0;
+    virtual void OnUnmounted(base::Optional<base::TimeDelta> remount_delay) = 0;
+    virtual void OnMountFailed(
+        base::Optional<base::TimeDelta> remount_delay) = 0;
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(MountObserver);
+  };
+
   class Delegate {
    public:
     Delegate() = default;
@@ -69,17 +82,13 @@
     virtual std::unique_ptr<MojoConnectionDelegate>
     CreateMojoConnectionDelegate();
 
-    virtual void OnMounted(const base::FilePath& mount_path) = 0;
-    virtual void OnUnmounted(base::Optional<base::TimeDelta> remount_delay) = 0;
-    virtual void OnMountFailed(
-        base::Optional<base::TimeDelta> remount_delay) = 0;
-
    private:
     DISALLOW_COPY_AND_ASSIGN(Delegate);
   };
 
   DriveFsHost(const base::FilePath& profile_path,
               Delegate* delegate,
+              MountObserver* mount_observer,
               std::unique_ptr<base::OneShotTimer> timer);
   ~DriveFsHost();
 
@@ -112,6 +121,7 @@
   const base::FilePath profile_path_;
 
   Delegate* const delegate_;
+  MountObserver* const mount_observer_;
 
   std::unique_ptr<base::OneShotTimer> timer_;
 
diff --git a/chromeos/components/drivefs/drivefs_host_unittest.cc b/chromeos/components/drivefs/drivefs_host_unittest.cc
index 10ca647..ba4e198 100644
--- a/chromeos/components/drivefs/drivefs_host_unittest.cc
+++ b/chromeos/components/drivefs/drivefs_host_unittest.cc
@@ -107,7 +107,8 @@
   MockOAuth2MintTokenFlow* mock_;
 };
 
-class TestingDriveFsHostDelegate : public DriveFsHost::Delegate {
+class TestingDriveFsHostDelegate : public DriveFsHost::Delegate,
+                                   public DriveFsHost::MountObserver {
  public:
   TestingDriveFsHostDelegate(
       std::unique_ptr<service_manager::Connector> connector,
@@ -120,7 +121,7 @@
     pending_bootstrap_ = std::move(pending_bootstrap);
   }
 
-  // DriveFsHost::Delegate:
+  // DriveFsHost::MountObserver:
   MOCK_METHOD1(OnMounted, void(const base::FilePath&));
   MOCK_METHOD1(OnMountFailed, void(base::Optional<base::TimeDelta>));
   MOCK_METHOD1(OnUnmounted, void(base::Optional<base::TimeDelta>));
@@ -268,8 +269,9 @@
         connector_factory_->CreateConnector(), account_id_);
     auto timer = std::make_unique<base::MockOneShotTimer>();
     timer_ = timer.get();
-    host_ = std::make_unique<DriveFsHost>(profile_path_, host_delegate_.get(),
-                                          std::move(timer));
+    host_ =
+        std::make_unique<DriveFsHost>(profile_path_, host_delegate_.get(),
+                                      host_delegate_.get(), std::move(timer));
   }
 
   void TearDown() override {
@@ -598,7 +600,7 @@
     host_delegate_ = std::make_unique<TestingDriveFsHostDelegate>(
         connector_factory_->CreateConnector(), account);
     host_ = std::make_unique<DriveFsHost>(
-        profile_path_, host_delegate_.get(),
+        profile_path_, host_delegate_.get(), host_delegate_.get(),
         std::make_unique<base::MockOneShotTimer>());
     EXPECT_FALSE(host_->Mount());
     EXPECT_FALSE(host_->IsMounted());
diff --git a/chromeos/dbus/cryptohome_client.cc b/chromeos/dbus/cryptohome_client.cc
index efc0ea9..e98c15b4 100644
--- a/chromeos/dbus/cryptohome_client.cc
+++ b/chromeos/dbus/cryptohome_client.cc
@@ -838,6 +838,13 @@
                          request, std::move(callback));
   }
 
+  void GetTpmStatus(
+      const cryptohome::GetTpmStatusRequest& request,
+      DBusMethodCallback<cryptohome::BaseReply> callback) override {
+    CallCryptohomeMethod(cryptohome::kCryptohomeGetTpmStatus, request,
+                         std::move(callback));
+  }
+
   void RemoveFirmwareManagementParametersFromTpm(
       const cryptohome::RemoveFirmwareManagementParametersRequest& request,
       DBusMethodCallback<cryptohome::BaseReply> callback) override {
@@ -901,7 +908,6 @@
         &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
         base::BindOnce(&CryptohomeClientImpl::OnBoolMethod,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-
   }
 
   void GetCurrentSpaceForUid(const uid_t android_uid,
diff --git a/chromeos/dbus/cryptohome_client.h b/chromeos/dbus/cryptohome_client.h
index b1e404b..d6b4b36 100644
--- a/chromeos/dbus/cryptohome_client.h
+++ b/chromeos/dbus/cryptohome_client.h
@@ -29,6 +29,7 @@
 class GetBootAttributeRequest;
 class GetKeyDataRequest;
 class GetSupportedKeyPoliciesRequest;
+class GetTpmStatusRequest;
 class MigrateKeyRequest;
 class MigrateToDircryptoRequest;
 class MountGuestRequest;
@@ -550,6 +551,12 @@
       const cryptohome::FlushAndSignBootAttributesRequest& request,
       DBusMethodCallback<cryptohome::BaseReply> callback) = 0;
 
+  // Asynchronously gets the underlying TPM status information and passes it to
+  // the given callback with reply protobuf.
+  virtual void GetTpmStatus(
+      const cryptohome::GetTpmStatusRequest& request,
+      DBusMethodCallback<cryptohome::BaseReply> callback) = 0;
+
   // Asynchronously calls MigrateToDircrypto method. It tells cryptohomed to
   // start migration, and is immediately called back by |callback|. The actual
   // result response is done via DircryptoMigrationProgress callback with its
diff --git a/chromeos/dbus/fake_cryptohome_client.cc b/chromeos/dbus/fake_cryptohome_client.cc
index 64bc0bb0..6e65ee2 100644
--- a/chromeos/dbus/fake_cryptohome_client.cc
+++ b/chromeos/dbus/fake_cryptohome_client.cc
@@ -638,6 +638,12 @@
   ReturnProtobufMethodCallback(cryptohome::BaseReply(), std::move(callback));
 }
 
+void FakeCryptohomeClient::GetTpmStatus(
+    const cryptohome::GetTpmStatusRequest& request,
+    DBusMethodCallback<cryptohome::BaseReply> callback) {
+  ReturnProtobufMethodCallback(cryptohome::BaseReply(), std::move(callback));
+}
+
 void FakeCryptohomeClient::MigrateToDircrypto(
     const cryptohome::AccountIdentifier& cryptohome_id,
     const cryptohome::MigrateToDircryptoRequest& request,
diff --git a/chromeos/dbus/fake_cryptohome_client.h b/chromeos/dbus/fake_cryptohome_client.h
index 10eefa7f..c65490f 100644
--- a/chromeos/dbus/fake_cryptohome_client.h
+++ b/chromeos/dbus/fake_cryptohome_client.h
@@ -195,6 +195,9 @@
   void FlushAndSignBootAttributes(
       const cryptohome::FlushAndSignBootAttributesRequest& request,
       DBusMethodCallback<cryptohome::BaseReply> callback) override;
+  void GetTpmStatus(
+      const cryptohome::GetTpmStatusRequest& request,
+      DBusMethodCallback<cryptohome::BaseReply> callback) override;
   void MigrateToDircrypto(const cryptohome::AccountIdentifier& cryptohome_id,
                           const cryptohome::MigrateToDircryptoRequest& request,
                           VoidDBusMethodCallback callback) override;
diff --git a/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl.cc b/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl.cc
index b053119..7f134e0 100644
--- a/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl.cc
+++ b/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl.cc
@@ -232,10 +232,12 @@
       !verified_host_device_id_before_update) {
     return;
   }
+
   // If the host stayed the same, there was no switch.
   if (*verified_host_device_id_from_most_recent_update_ ==
-      *verified_host_device_id_before_update)
+      *verified_host_device_id_before_update) {
     return;
+  }
 
   delegate()->OnConnectedHostSwitchedForExistingUser(
       host_status_with_device.host_device()->name());
@@ -252,7 +254,12 @@
   // update, i.e. there was no verified host before the host status update but
   // afterward there was a verified host.
   if (!verified_host_device_id_from_most_recent_update_ ||
-      verified_host_device_id_before_update)
+      verified_host_device_id_before_update) {
+    return;
+  }
+
+  // This event is specific to setup taking place on a different Chromebook.
+  if (host_device_timestamp_manager_->WasHostSetFromThisChromebook())
     return;
 
   delegate()->OnNewChromebookAddedForExistingUser(
diff --git a/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl_unittest.cc b/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl_unittest.cc
index c8e0f94..d3bb11e 100644
--- a/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl_unittest.cc
+++ b/chromeos/services/multidevice_setup/account_status_change_delegate_notifier_impl_unittest.cc
@@ -74,6 +74,27 @@
     delegate_notifier_->FlushForTesting();
   }
 
+  // Simulates finding a potential host, going through setup flow with it, and
+  // verifying it.
+  void SetUpHost(const cryptauth::RemoteDeviceRef& host_device) {
+    SetHostWithStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
+                      base::nullopt /* host_device */);
+    fake_host_device_timestamp_manager_->set_was_host_set_from_this_chromebook(
+        true);
+    SetHostWithStatus(
+        mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation,
+        host_device);
+    SetHostWithStatus(mojom::HostStatus::kHostVerified, host_device);
+  }
+
+  // Simulates forgetting a set host.
+  void ForgetHost() {
+    fake_host_device_timestamp_manager_->set_was_host_set_from_this_chromebook(
+        false);
+    SetHostWithStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
+                      base::nullopt /* host_device */);
+  }
+
   void SetNewUserPotentialHostExistsTimestamp(int64_t timestamp) {
     test_pref_service_->SetInt64(AccountStatusChangeDelegateNotifierImpl::
                                      kNewUserPotentialHostExistsPrefName,
@@ -410,9 +431,7 @@
   EXPECT_EQ(0u,
             fake_delegate()->num_existing_user_host_switched_events_handled());
 
-  // Forget host.
-  SetHostWithStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
-                    base::nullopt /* host_device */);
+  ForgetHost();
   EXPECT_EQ(0u,
             fake_delegate()->num_existing_user_host_switched_events_handled());
 
@@ -441,11 +460,7 @@
        NoHostSwitchedEventWithoutExistingHost) {
   BuildAccountStatusChangeDelegateNotifier();
   SetAccountStatusChangeDelegatePtr();
-  // No enabled host initially.
-  SetHostWithStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
-                    base::nullopt /* host_device */);
-  // Set and verify host.
-  SetHostWithStatus(mojom::HostStatus::kHostVerified, kFakePhone);
+  SetUpHost(kFakePhone);
   EXPECT_EQ(0u,
             fake_delegate()->num_existing_user_host_switched_events_handled());
 }
@@ -538,6 +553,24 @@
 }
 
 TEST_F(MultiDeviceSetupAccountStatusChangeDelegateNotifierTest,
+       ChromebookAddedEventBlockedIfHostWasSetFromThisChromebook) {
+  BuildAccountStatusChangeDelegateNotifier();
+  SetAccountStatusChangeDelegatePtr();
+
+  SetUpHost(kFakePhone);
+  // The host was set on this Chromebook so it should not trigger the Chromebook
+  // added event
+  EXPECT_EQ(
+      0u, fake_delegate()->num_existing_user_chromebook_added_events_handled());
+
+  ForgetHost();
+  // Set verified host on another Chromebook.
+  SetHostWithStatus(mojom::HostStatus::kHostVerified, kFakePhone);
+  EXPECT_EQ(
+      1u, fake_delegate()->num_existing_user_chromebook_added_events_handled());
+}
+
+TEST_F(MultiDeviceSetupAccountStatusChangeDelegateNotifierTest,
        OldTimestampInPreferencesDoesNotPreventChromebookAddedEvent) {
   int64_t earlier_test_time_millis = kTestTimeMillis / 2;
   SetExistingUserChromebookAddedTimestamp(earlier_test_time_millis);
@@ -593,9 +626,7 @@
   EXPECT_EQ(GetMostRecentVerifiedHostDeviceIdPref(),
             kFakePhoneAlternate.GetDeviceId());
 
-  // Forget host.
-  SetHostWithStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet,
-                    base::nullopt /* host_device */);
+  ForgetHost();
   EXPECT_EQ(GetMostRecentVerifiedHostDeviceIdPref(), "");
 }
 
diff --git a/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.cc b/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.cc
index 7f09cbd..2c50db4 100644
--- a/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.cc
+++ b/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.cc
@@ -8,10 +8,17 @@
 
 namespace multidevice_setup {
 
-FakeHostDeviceTimestampManager::FakeHostDeviceTimestampManager() = default;
+FakeHostDeviceTimestampManager::FakeHostDeviceTimestampManager() {
+  was_host_set_from_this_chromebook_ = false;
+}
 
 FakeHostDeviceTimestampManager::~FakeHostDeviceTimestampManager() = default;
 
+void FakeHostDeviceTimestampManager::set_was_host_set_from_this_chromebook(
+    bool was_host_set_from_this_chromebook) {
+  was_host_set_from_this_chromebook_ = was_host_set_from_this_chromebook;
+}
+
 void FakeHostDeviceTimestampManager::set_completion_timestamp(
     const base::Time& timestamp) {
   completion_time_ = timestamp;
@@ -22,6 +29,10 @@
   verification_time_ = timestamp;
 }
 
+bool FakeHostDeviceTimestampManager::WasHostSetFromThisChromebook() {
+  return was_host_set_from_this_chromebook_;
+}
+
 base::Optional<base::Time>
 FakeHostDeviceTimestampManager::GetLatestSetupFlowCompletionTimestamp() {
   return completion_time_;
diff --git a/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.h b/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.h
index c1caf78f..127e10c 100644
--- a/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.h
+++ b/chromeos/services/multidevice_setup/fake_host_device_timestamp_manager.h
@@ -18,14 +18,18 @@
   FakeHostDeviceTimestampManager();
   ~FakeHostDeviceTimestampManager() override;
 
+  void set_was_host_set_from_this_chromebook(
+      bool was_host_set_from_this_chromebook);
   void set_completion_timestamp(const base::Time& timestamp);
   void set_verification_timestamp(const base::Time& timestamp);
 
  private:
   // HostDeviceTimestampManager:
+  bool WasHostSetFromThisChromebook() override;
   base::Optional<base::Time> GetLatestSetupFlowCompletionTimestamp() override;
   base::Optional<base::Time> GetLatestVerificationTimestamp() override;
 
+  bool was_host_set_from_this_chromebook_;
   base::Optional<base::Time> completion_time_;
   base::Optional<base::Time> verification_time_;
 };
diff --git a/chromeos/services/multidevice_setup/host_device_timestamp_manager.h b/chromeos/services/multidevice_setup/host_device_timestamp_manager.h
index a6accfa..fb8b2416 100644
--- a/chromeos/services/multidevice_setup/host_device_timestamp_manager.h
+++ b/chromeos/services/multidevice_setup/host_device_timestamp_manager.h
@@ -18,6 +18,10 @@
  public:
   virtual ~HostDeviceTimestampManager() = default;
 
+  // Returns true when there is a host set (not necessarily verified) for the
+  // logged in GAIA account and that host was set from this Chromebook.
+  virtual bool WasHostSetFromThisChromebook() = 0;
+
   // If the logged in GAIA account has completed the MultiDevice setup flow on
   // this device, this returns the time at which the flow was completed. If the
   // flow was completed more than once, it records the most recent time of
diff --git a/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.cc b/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.cc
index 9e0cd5f..4d49263 100644
--- a/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.cc
+++ b/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.cc
@@ -51,6 +51,11 @@
 }
 
 // static
+const char
+    HostDeviceTimestampManagerImpl::kWasHostSetFromThisChromebookPrefName[] =
+        "multidevice_setup.was_host_set_from_this_chromebook";
+
+// static
 const char HostDeviceTimestampManagerImpl::kSetupFlowCompletedPrefName[] =
     "multidevice_setup.setup_flow_completed";
 
@@ -62,6 +67,7 @@
 // static
 void HostDeviceTimestampManagerImpl::RegisterPrefs(
     PrefRegistrySimple* registry) {
+  registry->RegisterBooleanPref(kWasHostSetFromThisChromebookPrefName, false);
   registry->RegisterInt64Pref(kSetupFlowCompletedPrefName, kTimestampNotSet);
   registry->RegisterInt64Pref(kHostVerifiedUpdateReceivedPrefName,
                               kTimestampNotSet);
@@ -81,6 +87,10 @@
   host_status_provider_->AddObserver(this);
 }
 
+bool HostDeviceTimestampManagerImpl::WasHostSetFromThisChromebook() {
+  return pref_service_->GetBoolean(kWasHostSetFromThisChromebookPrefName);
+}
+
 base::Optional<base::Time>
 HostDeviceTimestampManagerImpl::GetLatestSetupFlowCompletionTimestamp() {
   if (pref_service_->GetInt64(kSetupFlowCompletedPrefName) == kTimestampNotSet)
@@ -104,11 +114,13 @@
   // to use a host status update with the status
   // kHostSetLocallyButWaitingForBackendConfirmation as a proxy for completing
   // setup flow because the Chromebook sets a host locally (i.e. enters this
-  // state) exactly when it successfully completes the flow.
+  // state) exactly when it successfully completes the flow. Note that this is
+  // equivalent to a host being set on the Chromebook.
   if (host_status_with_device.host_status() ==
       mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation) {
     pref_service_->SetInt64(kSetupFlowCompletedPrefName,
                             clock_->Now().ToJavaTime());
+    pref_service_->SetBoolean(kWasHostSetFromThisChromebookPrefName, true);
     PA_LOG(INFO) << "HostDeviceTimestampManagerImpl::OnHostStatusChange(): "
                  << "Setup flow successfully completed. Recording timestamp "
                  << pref_service_->GetInt64(kSetupFlowCompletedPrefName) << ".";
@@ -124,6 +136,15 @@
                  << pref_service_->GetInt64(kHostVerifiedUpdateReceivedPrefName)
                  << ".";
   }
+
+  // If there is no host set, set the "was host set form this Chromebook" bit to
+  // false.
+  if (host_status_with_device.host_status() ==
+          mojom::HostStatus::kNoEligibleHosts ||
+      host_status_with_device.host_status() ==
+          mojom::HostStatus::kEligibleHostExistsButNoHostSet) {
+    pref_service_->SetBoolean(kWasHostSetFromThisChromebookPrefName, false);
+  }
 }
 
 }  // namespace multidevice_setup
diff --git a/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.h b/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.h
index 86eb986..4af9445d 100644
--- a/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.h
+++ b/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl.h
@@ -46,10 +46,12 @@
   ~HostDeviceTimestampManagerImpl() override;
 
   // HostDeviceTimestampManager:
+  bool WasHostSetFromThisChromebook() override;
   base::Optional<base::Time> GetLatestSetupFlowCompletionTimestamp() override;
   base::Optional<base::Time> GetLatestVerificationTimestamp() override;
 
  private:
+  static const char kWasHostSetFromThisChromebookPrefName[];
   static const char kSetupFlowCompletedPrefName[];
   static const char kHostVerifiedUpdateReceivedPrefName[];
 
diff --git a/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl_unittest.cc b/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl_unittest.cc
index 9588775..47b64009 100644
--- a/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl_unittest.cc
+++ b/chromeos/services/multidevice_setup/host_device_timestamp_manager_impl_unittest.cc
@@ -38,7 +38,7 @@
     test_clock_ = std::make_unique<base::SimpleTestClock>();
     SetNow(kTestTime);
 
-    recorder_ = HostDeviceTimestampManagerImpl::Factory::Get()->BuildInstance(
+    manager_ = HostDeviceTimestampManagerImpl::Factory::Get()->BuildInstance(
         fake_host_status_provider_.get(), test_pref_service_.get(),
         test_clock_.get());
   }
@@ -61,7 +61,7 @@
 
   void SetNow(const base::Time now) { test_clock_->SetNow(now); }
 
-  HostDeviceTimestampManager* recorder() { return recorder_.get(); }
+  HostDeviceTimestampManager* manager() { return manager_.get(); }
 
  private:
   std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
@@ -69,36 +69,60 @@
   std::unique_ptr<FakeHostStatusProvider> fake_host_status_provider_;
   std::unique_ptr<base::SimpleTestClock> test_clock_;
 
-  std::unique_ptr<HostDeviceTimestampManager> recorder_;
+  std::unique_ptr<HostDeviceTimestampManager> manager_;
 
   DISALLOW_COPY_AND_ASSIGN(HostDeviceTimestampManagerImplTest);
 };
 
-TEST_F(HostDeviceTimestampManagerImplTest, RecordsCorrectCompletionTime) {
-  EXPECT_FALSE(recorder()->GetLatestSetupFlowCompletionTimestamp());
+TEST_F(HostDeviceTimestampManagerImplTest,
+       RecordsWhetherHostWasSetFromThisChromebook) {
+  EXPECT_FALSE(manager()->WasHostSetFromThisChromebook());
+  // Discover potential host.
+  SetHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet);
+
+  // Set up host.
   SetHostStatus(
       mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation);
-  EXPECT_EQ(kTestTime, recorder()->GetLatestSetupFlowCompletionTimestamp());
+  EXPECT_TRUE(manager()->WasHostSetFromThisChromebook());
+
+  // Verify host.
+  SetHostStatus(mojom::HostStatus::kHostVerified);
+  EXPECT_TRUE(manager()->WasHostSetFromThisChromebook());
+
+  // Forget the host.
+  SetHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet);
+  EXPECT_FALSE(manager()->WasHostSetFromThisChromebook());
+
+  // Set verified host from a different Chromebook
+  SetHostStatus(mojom::HostStatus::kHostVerified);
+  EXPECT_FALSE(manager()->WasHostSetFromThisChromebook());
+}
+
+TEST_F(HostDeviceTimestampManagerImplTest, RecordsCorrectCompletionTime) {
+  EXPECT_FALSE(manager()->GetLatestSetupFlowCompletionTimestamp());
+  SetHostStatus(
+      mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation);
+  EXPECT_EQ(kTestTime, manager()->GetLatestSetupFlowCompletionTimestamp());
   // Forget the host.
   SetHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet);
   // Set up later and check that the new time replaces the old.
   SetNow(kLaterTime);
   SetHostStatus(
       mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation);
-  EXPECT_EQ(kLaterTime, recorder()->GetLatestSetupFlowCompletionTimestamp());
+  EXPECT_EQ(kLaterTime, manager()->GetLatestSetupFlowCompletionTimestamp());
 }
 
 TEST_F(HostDeviceTimestampManagerImplTest, RecordsCorrectVerificationTime) {
-  EXPECT_FALSE(recorder()->GetLatestVerificationTimestamp());
+  EXPECT_FALSE(manager()->GetLatestVerificationTimestamp());
   // Update with verified host.
   SetHostStatus(mojom::HostStatus::kHostVerified);
-  EXPECT_EQ(kTestTime, recorder()->GetLatestVerificationTimestamp());
+  EXPECT_EQ(kTestTime, manager()->GetLatestVerificationTimestamp());
   // Forget the host.
   SetHostStatus(mojom::HostStatus::kEligibleHostExistsButNoHostSet);
   // Set up later and check that the new time replaces the old.
   SetNow(kLaterTime);
   SetHostStatus(mojom::HostStatus::kHostVerified);
-  EXPECT_EQ(kLaterTime, recorder()->GetLatestVerificationTimestamp());
+  EXPECT_EQ(kLaterTime, manager()->GetLatestVerificationTimestamp());
 }
 
 TEST_F(HostDeviceTimestampManagerImplTest,
@@ -107,8 +131,8 @@
       mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation);
   SetNow(kLaterTime);
   SetHostStatus(mojom::HostStatus::kHostVerified);
-  EXPECT_EQ(kTestTime, recorder()->GetLatestSetupFlowCompletionTimestamp());
-  EXPECT_EQ(kLaterTime, recorder()->GetLatestVerificationTimestamp());
+  EXPECT_EQ(kTestTime, manager()->GetLatestSetupFlowCompletionTimestamp());
+  EXPECT_EQ(kLaterTime, manager()->GetLatestVerificationTimestamp());
 }
 }  // namespace multidevice_setup
 
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc
index 0094705..755fb93 100644
--- a/components/autofill_assistant/browser/script_executor.cc
+++ b/components/autofill_assistant/browser/script_executor.cc
@@ -25,6 +25,7 @@
       delegate_(delegate),
       at_end_(CONTINUE),
       should_stop_script_(false),
+      should_clean_contextual_ui_on_finish_(false),
       weak_ptr_factory_(this) {
   DCHECK(delegate_);
 }
@@ -181,6 +182,10 @@
 
 void ScriptExecutor::RunCallback(bool success) {
   DCHECK(callback_);
+  if (should_clean_contextual_ui_on_finish_ || !success) {
+    HideDetails();
+    should_clean_contextual_ui_on_finish_ = false;
+  }
 
   ScriptExecutor::Result result;
   result.success = success;
@@ -200,6 +205,7 @@
   }
 
   Action* action = actions_[processed_actions_.size()].get();
+  should_clean_contextual_ui_on_finish_ = action->proto().clean_contextual_ui();
   int delay_ms = action->proto().action_delay_ms();
   if (delay_ms > 0) {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
diff --git a/components/autofill_assistant/browser/script_executor.h b/components/autofill_assistant/browser/script_executor.h
index 63410cf8..bc25faf 100644
--- a/components/autofill_assistant/browser/script_executor.h
+++ b/components/autofill_assistant/browser/script_executor.h
@@ -108,6 +108,7 @@
   std::string last_server_payload_;
   AtEnd at_end_;
   bool should_stop_script_;
+  bool should_clean_contextual_ui_on_finish_;
 
   base::WeakPtrFactory<ScriptExecutor> weak_ptr_factory_;
   DISALLOW_COPY_AND_ASSIGN(ScriptExecutor);
diff --git a/components/autofill_assistant/browser/script_executor_unittest.cc b/components/autofill_assistant/browser/script_executor_unittest.cc
index 07539a1..93e58ae 100644
--- a/components/autofill_assistant/browser/script_executor_unittest.cc
+++ b/components/autofill_assistant/browser/script_executor_unittest.cc
@@ -286,5 +286,61 @@
   EXPECT_FALSE(scoped_task_environment_.MainThreadHasPendingTask());
 }
 
+TEST_F(ScriptExecutorTest, HideDetailsWhenFinished) {
+  ActionsResponseProto actions_response;
+  actions_response.set_server_payload("payload");
+  ActionProto click_with_clean_contextual_ui;
+  click_with_clean_contextual_ui.set_clean_contextual_ui(true);
+  click_with_clean_contextual_ui.mutable_tell()->set_message("clean");
+  ;
+  *actions_response.add_actions() = click_with_clean_contextual_ui;
+
+  EXPECT_CALL(mock_service_, OnGetActions(_, _, _))
+      .WillOnce(RunOnceCallback<2>(true, Serialize(actions_response)));
+  EXPECT_CALL(mock_service_, OnGetNextActions(_, _, _))
+      .WillOnce(RunOnceCallback<2>(true, ""));
+  EXPECT_CALL(executor_callback_,
+              Run(Field(&ScriptExecutor::Result::success, true)));
+  EXPECT_CALL(mock_ui_controller_, HideDetails());
+  executor_->Run(executor_callback_.Get());
+}
+
+TEST_F(ScriptExecutorTest, DontHideDetailsIfOtherActionsAreLeft) {
+  ActionsResponseProto actions_response;
+  actions_response.set_server_payload("payload");
+  ActionProto click_with_clean_contextual_ui;
+  click_with_clean_contextual_ui.set_clean_contextual_ui(true);
+  click_with_clean_contextual_ui.mutable_tell()->set_message("clean");
+  *actions_response.add_actions() = click_with_clean_contextual_ui;
+  actions_response.add_actions()->mutable_tell()->set_message("Wait no!");
+
+  EXPECT_CALL(mock_service_, OnGetActions(_, _, _))
+      .WillOnce(RunOnceCallback<2>(true, Serialize(actions_response)));
+  EXPECT_CALL(mock_service_, OnGetNextActions(_, _, _))
+      .WillOnce(RunOnceCallback<2>(true, ""));
+  EXPECT_CALL(executor_callback_,
+              Run(Field(&ScriptExecutor::Result::success, true)));
+
+  EXPECT_CALL(mock_ui_controller_, HideDetails()).Times(0);
+
+  executor_->Run(executor_callback_.Get());
+}
+
+TEST_F(ScriptExecutorTest, HideDetailsOnError) {
+  ActionsResponseProto actions_response;
+  actions_response.set_server_payload("payload");
+  actions_response.add_actions()->mutable_tell()->set_message("Hello");
+  EXPECT_CALL(mock_service_, OnGetActions(_, _, _))
+      .WillOnce(RunOnceCallback<2>(true, Serialize(actions_response)));
+  EXPECT_CALL(mock_service_, OnGetNextActions(_, _, _))
+      .WillOnce(RunOnceCallback<2>(false, ""));
+  EXPECT_CALL(executor_callback_,
+              Run(Field(&ScriptExecutor::Result::success, false)));
+
+  EXPECT_CALL(mock_ui_controller_, HideDetails());
+
+  executor_->Run(executor_callback_.Get());
+}
+
 }  // namespace
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index 1556a52..25a55d6 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -199,6 +199,11 @@
     ResetProto reset = 34;
     StopProto stop = 35;
   }
+
+  // Set to true to make the client remove any contextual information if the
+  // script finishes with this action. It has no effect if there is any other
+  // action sent to the client after this one. Default is false.
+  optional bool clean_contextual_ui = 33;
 }
 
 message ProcessedActionProto {
@@ -391,4 +396,4 @@
 // Show contextual information.
 message ShowDetailsProto {
   optional DetailsProto details = 1;
-}
\ No newline at end of file
+}
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc
index b1250224..dae8f7d 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_features.cc
@@ -48,7 +48,7 @@
 // harness, and disables the observer for data use ascriber.
 const base::Feature kDataSaverSiteBreakdownUsingPageLoadMetrics{
     "DataSaverSiteBreakdownUsingPageLoadMetrics",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+    base::FEATURE_ENABLED_BY_DEFAULT};
 
 // If enabled, "br" is not added to the accept-encoding header. This effectively
 // disables the use of Brotli on the connection from Chrome to secure
diff --git a/components/drive/drive_pref_names.cc b/components/drive/drive_pref_names.cc
index 41773b6..ceeed21 100644
--- a/components/drive/drive_pref_names.cc
+++ b/components/drive/drive_pref_names.cc
@@ -26,5 +26,9 @@
 // A boolean pref containing whether pinned files have been migrated to DriveFS.
 const char kDriveFsPinnedMigrated[] = "drivefs.pinned_migrated";
 
+// A boolean pref containing whether DriveFS was ever successfully launched.
+const char kDriveFsWasLaunchedAtLeastOnce[] =
+    "drivefs.was_launched_at_least_once";
+
 }  // namespace prefs
 }  // namespace drive
diff --git a/components/drive/drive_pref_names.h b/components/drive/drive_pref_names.h
index a4c76e28..f6ae89a 100644
--- a/components/drive/drive_pref_names.h
+++ b/components/drive/drive_pref_names.h
@@ -15,6 +15,7 @@
 extern const char kDisableDriveHostedFiles[];
 extern const char kDriveFsProfileSalt[];
 extern const char kDriveFsPinnedMigrated[];
+extern const char kDriveFsWasLaunchedAtLeastOnce[];
 
 }  // namespace prefs
 }  // namespace drive
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc
index 84fb92c..2f4d9d7 100644
--- a/components/exo/client_controlled_shell_surface.cc
+++ b/components/exo/client_controlled_shell_surface.cc
@@ -658,7 +658,8 @@
       static_cast<ash::NonClientFrameViewAsh*>(
           ShellSurfaceBase::CreateNonClientFrameView(widget));
   immersive_fullscreen_controller_ =
-      std::make_unique<ash::ImmersiveFullscreenController>();
+      std::make_unique<ash::ImmersiveFullscreenController>(
+          ash::Shell::Get()->immersive_context());
   frame_view->InitImmersiveFullscreenControllerForView(
       immersive_fullscreen_controller_.get());
   return frame_view;
diff --git a/components/feed/content/feed_offline_host.cc b/components/feed/content/feed_offline_host.cc
index 19006056..03cfa4e 100644
--- a/components/feed/content/feed_offline_host.cc
+++ b/components/feed/content/feed_offline_host.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/hash.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "components/feed/core/feed_scheduler_host.h"
 #include "components/offline_pages/core/prefetch/prefetch_service.h"
 #include "url/gurl.h"
@@ -139,7 +140,18 @@
   trigger_get_known_content_ = trigger_get_known_content;
   notify_status_change_ = notify_status_change;
   offline_page_model_->AddObserver(this);
-  // TODO(skym): Post task to call PrefetchService::SetSuggestionProvider().
+  // The host guarantees that the two callbacks passed into this method will not
+  // be invoked until Initialize() has exited. To guarantee this, the host
+  // cannot call SetSuggestionProvider() in task, because that would give
+  // Prefetch the ability to run |trigger_get_known_content_| immediately.
+  // PostTask is used to delay when SetSuggestionProvider() is called.
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&FeedOfflineHost::SetSuggestionProvider,
+                                weak_factory_.GetWeakPtr()));
+}
+
+void FeedOfflineHost::SetSuggestionProvider() {
+  prefetch_service_->SetSuggestionProvider(this);
 }
 
 base::Optional<int64_t> FeedOfflineHost::GetOfflineId(const std::string& url) {
@@ -166,11 +178,13 @@
 }
 
 void FeedOfflineHost::OnContentRemoved(std::vector<std::string> urls) {
-  // TODO(skym): Call PrefetchService::RemoveSuggestion().
+  for (const std::string& url : urls) {
+    prefetch_service_->RemoveSuggestion(GURL(url));
+  }
 }
 
 void FeedOfflineHost::OnNewContentReceived() {
-  // TODO(skym): Call PrefetchService::NewSuggestionsAvailable().
+  prefetch_service_->NewSuggestionsAvailable();
 }
 
 void FeedOfflineHost::OnNoListeners() {
diff --git a/components/feed/content/feed_offline_host.h b/components/feed/content/feed_offline_host.h
index 58db6d4..c72a1cc 100644
--- a/components/feed/content/feed_offline_host.h
+++ b/components/feed/content/feed_offline_host.h
@@ -47,9 +47,15 @@
   // Initialize with callbacks to call into bridge/Java side. Should only be
   // called once, and done as soon as the bridge is ready. The FeedOfflineHost
   // will not be fully ready to perform its function without these dependencies.
+  // Neither of these callbacks will be invoked until after this method exits.
   void Initialize(const base::RepeatingClosure& trigger_get_known_content,
                   const NotifyStatusChangeCallback& notify_status_change);
 
+  // Called during initialization make ourselves known to |prefetch_service_|.
+  // This method is used to wrap PrefetchService::SetSuggestionProvider() to let
+  // our weak pointer guarantee everyone is still alive.
+  void SetSuggestionProvider();
+
   // Synchronously returns the offline id of the given page. The host will only
   // have knowledge of the page if it had previously returned status about it
   // through GetOfflineState() or as a notification. Otherwise the caller will
diff --git a/components/feed/content/feed_offline_host_unittest.cc b/components/feed/content/feed_offline_host_unittest.cc
index 70ae6e4..2e9291bf 100644
--- a/components/feed/content/feed_offline_host_unittest.cc
+++ b/components/feed/content/feed_offline_host_unittest.cc
@@ -33,6 +33,7 @@
 using offline_pages::MultipleOfflinePageItemCallback;
 using offline_pages::PrefetchSuggestion;
 using offline_pages::StubPrefetchService;
+using offline_pages::SuggestionsProvider;
 
 constexpr char kUrl1[] = "https://www.one.com/";
 constexpr char kUrl2[] = "https://www.two.com/";
@@ -42,6 +43,10 @@
 constexpr char kTwo[] = "Two";
 constexpr char kThree[] = "Three";
 
+MATCHER_P(EqualsSpec, expected, "") {
+  return arg.spec() == expected;
+}
+
 class TestOfflinePageModel : public StubOfflinePageModel {
  public:
   void AddOfflinedPage(const std::string& url,
@@ -84,6 +89,13 @@
   std::multimap<std::string, OfflinePageItem> url_to_offline_page_item_;
 };
 
+class TestPrefetchService : public StubPrefetchService {
+ public:
+  MOCK_METHOD1(SetSuggestionProvider, void(SuggestionsProvider*));
+  MOCK_METHOD0(NewSuggestionsAvailable, void());
+  MOCK_METHOD1(RemoveSuggestion, void(GURL));
+};
+
 void IgnoreStatus(std::vector<std::string> result) {}
 
 void CopyStatus(std::vector<std::string>* out,
@@ -102,7 +114,7 @@
  public:
   TestOfflinePageModel* offline_page_model() { return &offline_page_model_; }
   FeedOfflineHost* host() { return host_.get(); }
-  StubPrefetchService* prefetch_service() { return &prefetch_service_; }
+  TestPrefetchService* prefetch_service() { return &prefetch_service_; }
   int get_suggestion_consumed_count() { return suggestion_consumed_count_; }
   int get_suggestions_shown_count() { return suggestions_shown_count_; }
   int get_get_known_content_count() { return get_known_content_count_; }
@@ -154,7 +166,7 @@
 
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   TestOfflinePageModel offline_page_model_;
-  StubPrefetchService prefetch_service_;
+  TestPrefetchService prefetch_service_;
   std::unique_ptr<FeedOfflineHost> host_;
   int suggestion_consumed_count_ = 0;
   int suggestions_shown_count_ = 0;
@@ -375,4 +387,37 @@
   ResetHost();
 }
 
+TEST_F(FeedOfflineHostTest, SetSuggestionProviderNotCalledSynchronously) {
+  EXPECT_CALL(*prefetch_service(), SetSuggestionProvider(testing::_)).Times(0);
+}
+
+TEST_F(FeedOfflineHostTest, SetSuggestionProviderCalledAsync) {
+  EXPECT_CALL(*prefetch_service(), SetSuggestionProvider(testing::_)).Times(1);
+  RunUntilIdle();
+}
+
+TEST_F(FeedOfflineHostTest, OnNewContentReceived) {
+  EXPECT_CALL(*prefetch_service(), NewSuggestionsAvailable()).Times(1);
+  host()->OnNewContentReceived();
+}
+
+TEST_F(FeedOfflineHostTest, RemoveZeroSuggestions) {
+  EXPECT_CALL(*prefetch_service(), RemoveSuggestion(testing::_)).Times(0);
+  host()->OnContentRemoved({});
+}
+
+TEST_F(FeedOfflineHostTest, RemoveOneSuggestion) {
+  EXPECT_CALL(*prefetch_service(), RemoveSuggestion(EqualsSpec(kUrl1)))
+      .Times(1);
+  host()->OnContentRemoved({kUrl1});
+}
+
+TEST_F(FeedOfflineHostTest, RemoveTwoSuggestions) {
+  EXPECT_CALL(*prefetch_service(), RemoveSuggestion(EqualsSpec(kUrl1)))
+      .Times(1);
+  EXPECT_CALL(*prefetch_service(), RemoveSuggestion(EqualsSpec(kUrl2)))
+      .Times(1);
+  host()->OnContentRemoved({kUrl1, kUrl2});
+}
+
 }  // namespace feed
diff --git a/components/neterror/resources/neterror.css b/components/neterror/resources/neterror.css
index 9655508..b0cfdda 100644
--- a/components/neterror/resources/neterror.css
+++ b/components/neterror/resources/neterror.css
@@ -507,6 +507,10 @@
   word-break: break-all;
 }
 
+.no-attribution .offline-content-suggestion-attribution {
+  display: none;
+}
+
 .offline-content-suggestion-freshness:before {
   content: '-';
   display: inline-block;
diff --git a/components/neterror/resources/neterror.js b/components/neterror/resources/neterror.js
index 86b1b34..bbbe8e7 100644
--- a/components/neterror/resources/neterror.js
+++ b/components/neterror/resources/neterror.js
@@ -174,11 +174,14 @@
 
 // Populates a summary of suggested offline content.
 function offlineContentSummaryAvailable(summary) {
+  // Note: See AvailableContentSummaryToValue in
+  // available_offline_content_helper.cc for the data contained in |summary|.
   if (!summary || summary.total_items == 0 ||
       !loadTimeData.valueExists('offlineContentSummary')) {
     return;
   }
-
+  // TODO(https://crbug.com/852872): Customize presented icons based on the
+  // types of available offline content.
   document.getElementById('offline-content-summary').hidden = false;
 }
 
@@ -190,14 +193,14 @@
       return 'image-video';
     case 2:  // kAudio
       return 'image-music-note';
-    case 0:  // kPrefetchedUnopenedPage
+    case 0:  // kPrefetchedPage
     case 3:  // kOtherPage
       return 'image-earth';
   }
   return 'image-file';
 }
 
-function getSuggestedContentDiv(item) {
+function getSuggestedContentDiv(item, index) {
   // Note: See AvailableContentToValue in available_offline_content_helper.cc
   // for the data contained in an |item|.
   var visual = '';
@@ -221,12 +224,12 @@
   <div class="offline-content-suggestion ${extraContainerClasses.join(' ')}"
     onclick="launchOfflineItem('${item.ID}', '${item.name_space}')">
       <div class="offline-content-suggestion-texts">
-        <div class="offline-content-suggestion-title">
-          ${item.title}
+        <div id="offline-content-suggestion-title-${index}"
+             class="offline-content-suggestion-title">
         </div>
         <div class="offline-content-suggestion-attribution-freshness">
-          <div class="offline-content-suggestion-attribution">
-            ${item.attribution}
+          <div id="offline-content-suggestion-attribution-${index}"
+               class="offline-content-suggestion-attribution">
           </div>
           <div class="offline-content-suggestion-freshness">
             ${item.date_modified}
@@ -242,20 +245,34 @@
 }
 
 // Populates a list of suggested offline content.
+// Note: For security reasons all content downloaded from the web is considered
+// unsafe and must be securely handled to be presented on the dino page. The
+// image content is already safely re-encoded after being downloaded but the
+// textual content, like title and attribution, must be properly handled here.
 function offlineContentAvailable(suggestions) {
   if (!suggestions || !loadTimeData.valueExists('offlineContentList'))
     return;
 
   var suggestionsHTML = [];
-  for (var item of suggestions)
-    suggestionsHTML.push(getSuggestedContentDiv(item));
+  for (var index = 0; index < suggestions.length; index++)
+    suggestionsHTML.push(getSuggestedContentDiv(suggestions[index], index));
+
   document.getElementById('offline-content-suggestions').innerHTML =
       suggestionsHTML.join('\n');
 
-  var contentListElement = document.getElementById('offline-content-list')
-  contentListElement.hidden = false;
+  // Sets textual web content using |textContent| to make sure it's handled as
+  // plain text.
+  for (var index = 0; index < suggestions.length; index++) {
+    document.getElementById(`offline-content-suggestion-title-${index}`)
+        .textContent = suggestions[index].title;
+    document.getElementById(`offline-content-suggestion-attribution-${index}`)
+        .textContent = suggestions[index].attribution;
+  }
+
+  var contentListElement = document.getElementById('offline-content-list');
   if (document.dir == 'rtl')
     contentListElement.classList.add('is-rtl');
+  contentListElement.hidden = false;
 }
 
 function onDocumentLoad() {
diff --git a/components/ntp_snippets/category.h b/components/ntp_snippets/category.h
index d421049..3964370 100644
--- a/components/ntp_snippets/category.h
+++ b/components/ntp_snippets/category.h
@@ -32,7 +32,7 @@
   PHYSICAL_WEB_PAGES_DEPRECATED,
 
   // Pages recently browsed to on other devices.
-  FOREIGN_TABS,
+  FOREIGN_TABS_DEPRECATED,
 
   // Pages from the user reading list.
   READING_LIST,
diff --git a/components/ntp_snippets/category_rankers/click_based_category_ranker_unittest.cc b/components/ntp_snippets/category_rankers/click_based_category_ranker_unittest.cc
index b6ff4b81..78b7d224 100644
--- a/components/ntp_snippets/category_rankers/click_based_category_ranker_unittest.cc
+++ b/components/ntp_snippets/category_rankers/click_based_category_ranker_unittest.cc
@@ -608,10 +608,10 @@
   ResetRanker(base::DefaultClock::GetInstance());
   // Make sure we have the default order.
   EXPECT_TRUE(CompareCategories(
-      Category::FromKnownCategory(KnownCategories::DOWNLOADS),
-      Category::FromKnownCategory(KnownCategories::FOREIGN_TABS)));
+      Category::FromKnownCategory(KnownCategories::READING_LIST),
+      Category::FromKnownCategory(KnownCategories::DOWNLOADS)));
   EXPECT_TRUE(CompareCategories(
-      Category::FromKnownCategory(KnownCategories::FOREIGN_TABS),
+      Category::FromKnownCategory(KnownCategories::DOWNLOADS),
       Category::FromKnownCategory(KnownCategories::BOOKMARKS)));
   EXPECT_TRUE(CompareCategories(
       Category::FromKnownCategory(KnownCategories::BOOKMARKS),
@@ -639,22 +639,22 @@
        ShouldResumePromotionAfter2WeeksSinceDismissal) {
   const Category downloads =
       Category::FromKnownCategory(KnownCategories::DOWNLOADS);
-  const Category foreign_tabs =
-      Category::FromKnownCategory(KnownCategories::FOREIGN_TABS);
-  ASSERT_TRUE(CompareCategories(downloads, foreign_tabs));
+  const Category articles =
+      Category::FromKnownCategory(KnownCategories::ARTICLES);
+  ASSERT_TRUE(CompareCategories(downloads, articles));
 
-  SetPromotedCategoryVariationParam(foreign_tabs.id());
+  SetPromotedCategoryVariationParam(articles.id());
   ResetRanker(base::DefaultClock::GetInstance());
-  ASSERT_TRUE(CompareCategories(foreign_tabs, downloads));
+  ASSERT_TRUE(CompareCategories(articles, downloads));
 
-  ranker()->OnCategoryDismissed(foreign_tabs);
-  ASSERT_FALSE(CompareCategories(foreign_tabs, downloads));
+  ranker()->OnCategoryDismissed(articles);
+  ASSERT_FALSE(CompareCategories(articles, downloads));
 
   // Simulate a little over 2 weeks of time passing.
   base::SimpleTestClock test_clock;
   test_clock.SetNow(base::Time::Now() + base::TimeDelta::FromDays(15));
   ResetRanker(&test_clock);
-  EXPECT_TRUE(CompareCategories(foreign_tabs, downloads));
+  EXPECT_TRUE(CompareCategories(articles, downloads));
 }
 
 TEST_F(ClickBasedCategoryRankerTest,
diff --git a/components/ntp_snippets/category_rankers/constant_category_ranker.cc b/components/ntp_snippets/category_rankers/constant_category_ranker.cc
index 00a6ae3..6a0711a 100644
--- a/components/ntp_snippets/category_rankers/constant_category_ranker.cc
+++ b/components/ntp_snippets/category_rankers/constant_category_ranker.cc
@@ -124,7 +124,6 @@
     case CategoryOrderChoice::GENERAL:
       categories.push_back(KnownCategories::READING_LIST);
       categories.push_back(KnownCategories::DOWNLOADS);
-      categories.push_back(KnownCategories::FOREIGN_TABS);
       categories.push_back(KnownCategories::BOOKMARKS);
       categories.push_back(KnownCategories::ARTICLES);
       break;
@@ -133,8 +132,6 @@
       categories.push_back(KnownCategories::READING_LIST);
       categories.push_back(KnownCategories::DOWNLOADS);
       categories.push_back(KnownCategories::BOOKMARKS);
-
-      categories.push_back(KnownCategories::FOREIGN_TABS);
       break;
   }
 
diff --git a/components/ntp_snippets/content_suggestions_metrics.cc b/components/ntp_snippets/content_suggestions_metrics.cc
index 2b7e3ca..247d7b11 100644
--- a/components/ntp_snippets/content_suggestions_metrics.cc
+++ b/components/ntp_snippets/content_suggestions_metrics.cc
@@ -85,7 +85,7 @@
   DOWNLOADS,
   BOOKMARKS,
   PHYSICAL_WEB_PAGES_DEPRECATED,
-  FOREIGN_TABS,
+  FOREIGN_TABS_DEPRECATED,
   ARTICLES,
   READING_LIST,
   CONTEXTUAL,
@@ -108,8 +108,8 @@
       return HistogramCategories::DOWNLOADS;
     case KnownCategories::BOOKMARKS:
       return HistogramCategories::BOOKMARKS;
-    case KnownCategories::FOREIGN_TABS:
-      return HistogramCategories::FOREIGN_TABS;
+    case KnownCategories::FOREIGN_TABS_DEPRECATED:
+      return HistogramCategories::FOREIGN_TABS_DEPRECATED;
     case KnownCategories::ARTICLES:
       return HistogramCategories::ARTICLES;
     case KnownCategories::READING_LIST:
@@ -136,8 +136,6 @@
       return "Downloads";
     case HistogramCategories::BOOKMARKS:
       return "Bookmarks";
-    case HistogramCategories::FOREIGN_TABS:
-      return "ForeignTabs";
     case HistogramCategories::ARTICLES:
       return "Articles";
     case HistogramCategories::EXPERIMENTAL:
@@ -146,6 +144,7 @@
       return "ReadingList";
     case HistogramCategories::CONTEXTUAL:
       return "Contextual";
+    case HistogramCategories::FOREIGN_TABS_DEPRECATED:
     case HistogramCategories::RECENT_TABS_DEPRECATED:
     case HistogramCategories::PHYSICAL_WEB_PAGES_DEPRECATED:
     case HistogramCategories::COUNT:
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
index 8cb8dd2..bfe4cf3 100644
--- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
+++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
@@ -81,6 +81,7 @@
     public long totalSizeBytes;
     public boolean externallyRemoved;
     public long creationTimeMs;
+    public long completionTimeMs;
     public long lastAccessedTimeMs;
     public boolean isOpenable;
     public String filePath;
@@ -126,6 +127,7 @@
         clone.totalSizeBytes = totalSizeBytes;
         clone.externallyRemoved = externallyRemoved;
         clone.creationTimeMs = creationTimeMs;
+        clone.completionTimeMs = completionTimeMs;
         clone.lastAccessedTimeMs = lastAccessedTimeMs;
         clone.isOpenable = isOpenable;
         clone.filePath = filePath;
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
index 83e2842..0510e78f 100644
--- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
+++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
@@ -47,10 +47,10 @@
             @OfflineItemFilter int filter, boolean isTransient, boolean isSuggested,
             boolean isAccelerated, boolean refreshVisuals, boolean promoteOrigin,
             long totalSizeBytes, boolean externallyRemoved, long creationTimeMs,
-            long lastAccessedTimeMs, boolean isOpenable, String filePath, String mimeType,
-            String pageUrl, String originalUrl, boolean isOffTheRecord, @OfflineItemState int state,
-            @PendingState int pendingState, boolean isResumable, boolean allowMetered,
-            long receivedBytes, long progressValue, long progressMax,
+            long completionTimeMs, long lastAccessedTimeMs, boolean isOpenable, String filePath,
+            String mimeType, String pageUrl, String originalUrl, boolean isOffTheRecord,
+            @OfflineItemState int state, @PendingState int pendingState, boolean isResumable,
+            boolean allowMetered, long receivedBytes, long progressValue, long progressMax,
             @OfflineItemProgressUnit int progressUnit, long timeRemainingMs, boolean isDangerous) {
         OfflineItem item = new OfflineItem();
         item.id.namespace = nameSpace;
@@ -66,6 +66,7 @@
         item.totalSizeBytes = totalSizeBytes;
         item.externallyRemoved = externallyRemoved;
         item.creationTimeMs = creationTimeMs;
+        item.completionTimeMs = completionTimeMs;
         item.lastAccessedTimeMs = lastAccessedTimeMs;
         item.isOpenable = isOpenable;
         item.filePath = filePath;
diff --git a/components/offline_items_collection/core/android/offline_item_bridge.cc b/components/offline_items_collection/core/android/offline_item_bridge.cc
index b84b6ad6..bdad81c 100644
--- a/components/offline_items_collection/core/android/offline_item_bridge.cc
+++ b/components/offline_items_collection/core/android/offline_item_bridge.cc
@@ -35,8 +35,9 @@
       static_cast<jint>(item.filter), item.is_transient, item.is_suggested,
       item.is_accelerated, item.refresh_visuals, item.promote_origin,
       item.total_size_bytes, item.externally_removed,
-      item.creation_time.ToJavaTime(), item.last_accessed_time.ToJavaTime(),
-      item.is_openable, ConvertUTF8ToJavaString(env, item.file_path.value()),
+      item.creation_time.ToJavaTime(), item.completion_time.ToJavaTime(),
+      item.last_accessed_time.ToJavaTime(), item.is_openable,
+      ConvertUTF8ToJavaString(env, item.file_path.value()),
       ConvertUTF8ToJavaString(env, item.mime_type),
       ConvertUTF8ToJavaString(env, item.page_url.spec()),
       ConvertUTF8ToJavaString(env, item.original_url.spec()),
diff --git a/components/offline_items_collection/core/offline_item.cc b/components/offline_items_collection/core/offline_item.cc
index 753e95f2..41a0d6c 100644
--- a/components/offline_items_collection/core/offline_item.cc
+++ b/components/offline_items_collection/core/offline_item.cc
@@ -78,6 +78,7 @@
          total_size_bytes == offline_item.total_size_bytes &&
          externally_removed == offline_item.externally_removed &&
          creation_time == offline_item.creation_time &&
+         completion_time == offline_item.completion_time &&
          last_accessed_time == offline_item.last_accessed_time &&
          is_openable == offline_item.is_openable &&
          file_path == offline_item.file_path &&
diff --git a/components/offline_items_collection/core/offline_item.h b/components/offline_items_collection/core/offline_item.h
index 13da294..5db64836 100644
--- a/components/offline_items_collection/core/offline_item.h
+++ b/components/offline_items_collection/core/offline_item.h
@@ -135,6 +135,10 @@
   // The time when the underlying offline content was created.
   base::Time creation_time;
 
+  // The time when the underlying offline content finished downloading,
+  // base::Time() if the download hasn't reached a completion state yet.
+  base::Time completion_time;
+
   // The last time the underlying offline content was accessed.
   base::Time last_accessed_time;
 
diff --git a/components/offline_pages/core/downloads/offline_item_conversions.cc b/components/offline_pages/core/downloads/offline_item_conversions.cc
index fc6e922..8605fcb 100644
--- a/components/offline_pages/core/downloads/offline_item_conversions.cc
+++ b/components/offline_pages/core/downloads/offline_item_conversions.cc
@@ -51,6 +51,8 @@
   item.state = OfflineItemState::COMPLETE;
   item.total_size_bytes = page.file_size;
   item.creation_time = page.creation_time;
+  // Completion time is the time when the offline archive was created.
+  item.completion_time = page.creation_time;
   item.last_accessed_time = page.last_access_time;
   item.file_path = page.file_path;
   item.mime_type = GetMimeType();
diff --git a/components/password_manager/ios/password_controller_helper.mm b/components/password_manager/ios/password_controller_helper.mm
index c365aac..691653e7d 100644
--- a/components/password_manager/ios/password_controller_helper.mm
+++ b/components/password_manager/ios/password_controller_helper.mm
@@ -11,6 +11,7 @@
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/autofill/core/common/password_form_fill_data.h"
+#include "components/autofill/ios/browser/autofill_switches.h"
 #include "components/autofill/ios/browser/autofill_util.h"
 #include "components/password_manager/core/browser/form_parsing/ios_form_parser.h"
 #include "components/password_manager/ios/account_select_fill_data.h"
@@ -174,7 +175,8 @@
                            inFrame:(web::WebFrame*)frame {
   DCHECK_EQ(_webState, webState);
   GURL pageURL = webState->GetLastCommittedURL();
-  if (pageURL.GetOrigin() != frame->GetSecurityOrigin()) {
+  if (autofill::switches::IsAutofillIFrameMessagingEnabled() &&
+      pageURL.GetOrigin() != frame->GetSecurityOrigin()) {
     // Passwords is only supported on main frame and iframes with the same
     // origin.
     return;
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 302e1b6..90f4798 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -838,6 +838,9 @@
 
   // Release channel (stable, beta, etc.).
   optional Channel channel = 22;
+
+  // TPM status information.
+  optional TpmStatusInfo tpm_status_info = 23;
 }
 
 message OsUpdateStatus {
@@ -1674,6 +1677,21 @@
   optional string vendor_specific = 6;
 }
 
+// Contains status of the TPM unit.  These fields come from GetTpmStatusReply
+// proto message from Chrome OS side (dbus/cryptohome/rpc.proto).
+message TpmStatusInfo {
+  optional bool enabled = 1;
+  optional bool owned = 2;
+  optional bool initialized = 3;
+  optional bool attestation_prepared = 4;
+  optional bool attestation_enrolled = 5;
+  optional int32 dictionary_attack_counter = 6;
+  optional int32 dictionary_attack_threshold = 7;
+  optional bool dictionary_attack_lockout_in_effect = 8;
+  optional int32 dictionary_attack_lockout_seconds_remaining = 9;
+  optional bool boot_lockbox_finalized = 10;
+}
+
 // System state included with some log events.
 message SystemState {
   // VolumeInfo is reused from existing Chrome reporting.
diff --git a/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc b/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc
index c9980542..7ce24ab 100644
--- a/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc
+++ b/components/safe_browsing/browser/safe_browsing_url_checker_impl.cc
@@ -305,7 +305,7 @@
 
   // If user decided to not proceed through a warning, mark all the remaining
   // redirects as "bad".
-  for (; next_index_ < urls_.size(); ++next_index_) {
+  while (next_index_ < urls_.size()) {
     if (!RunNextCallback(false, showed_interstitial))
       return;
   }
diff --git a/components/undo_strings.grdp b/components/undo_strings.grdp
index 8183e5d..f1380ca 100644
--- a/components/undo_strings.grdp
+++ b/components/undo_strings.grdp
@@ -1,6 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <grit-part>
 
+  <message name="IDS_BOOKMARK_BAR_UNDO_DESCRIPTION" desc="Shortcut description for undoing a bookmark operation, used as a hint for keyboard users">
+    press <ph name="MODIFIER_KEY_DESCRIPTION">$1<ex>Control Z</ex></ph> to undo
+  </message>
+
   <if expr="not use_titlecase">
     <message name="IDS_BOOKMARK_BAR_UNDO" desc="Menu title for undoing a bookmark operation">
       &amp;Undo
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index f03d785..050161d 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1810,6 +1810,8 @@
     "web_package/signed_exchange_loader.h",
     "web_package/signed_exchange_prefetch_handler.cc",
     "web_package/signed_exchange_prefetch_handler.h",
+    "web_package/signed_exchange_prefetch_metric_recorder.cc",
+    "web_package/signed_exchange_prefetch_metric_recorder.h",
     "web_package/signed_exchange_prologue.cc",
     "web_package/signed_exchange_prologue.h",
     "web_package/signed_exchange_request_handler.cc",
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
index 8563fb7d..24f5fbb 100644
--- a/content/browser/frame_host/frame_tree_node.cc
+++ b/content/browser/frame_host/frame_tree_node.cc
@@ -313,18 +313,6 @@
   }
 }
 
-bool FrameTreeNode::IsDescendantOf(FrameTreeNode* other) const {
-  if (!other || !other->child_count())
-    return false;
-
-  for (FrameTreeNode* node = parent(); node; node = node->parent()) {
-    if (node == other)
-      return true;
-  }
-
-  return false;
-}
-
 FrameTreeNode* FrameTreeNode::PreviousSibling() const {
   return GetSibling(-1);
 }
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h
index fdc902b..5952a07 100644
--- a/content/browser/frame_host/frame_tree_node.h
+++ b/content/browser/frame_host/frame_tree_node.h
@@ -267,8 +267,6 @@
     return render_manager_.current_frame_host();
   }
 
-  bool IsDescendantOf(FrameTreeNode* other) const;
-
   // Return the node immediately preceding this node in its parent's
   // |children_|, or nullptr if there is no such node.
   FrameTreeNode* PreviousSibling() const;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 15908f7f..df0aa51 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -170,6 +170,7 @@
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 #include "third_party/blink/public/common/blob/blob_utils.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
@@ -924,6 +925,18 @@
   return parent_;
 }
 
+bool RenderFrameHostImpl::IsDescendantOf(RenderFrameHost* ancestor) {
+  if (!ancestor || !static_cast<RenderFrameHostImpl*>(ancestor)->child_count())
+    return false;
+
+  for (RenderFrameHostImpl* current = GetParent(); current;
+       current = current->GetParent()) {
+    if (current == ancestor)
+      return true;
+  }
+  return false;
+}
+
 int RenderFrameHostImpl::GetFrameTreeNodeId() {
   return frame_tree_node_->frame_tree_node_id();
 }
@@ -4014,8 +4027,7 @@
     // descendants. Detect cases like this and skip them.
     bool has_same_site_ancestor = false;
     for (auto* added_rfh : beforeunload_pending_replies_) {
-      if (rfh->frame_tree_node()->IsDescendantOf(
-              added_rfh->frame_tree_node()) &&
+      if (rfh->IsDescendantOf(added_rfh) &&
           rfh->GetSiteInstance() == added_rfh->GetSiteInstance()) {
         has_same_site_ancestor = true;
         break;
@@ -4312,15 +4324,32 @@
       }
     }
 
+    std::unique_ptr<URLLoaderFactoryBundleInfo> factory_bundle_for_prefetch;
     network::mojom::URLLoaderFactoryPtr prefetch_loader_factory;
     if (subresource_loader_factories) {
       SaveSubresourceFactories(std::move(subresource_loader_factories));
+      factory_bundle_for_prefetch = CloneSubresourceFactories();
+    } else if (base::FeatureList::IsEnabled(
+                   blink::features::kServiceWorkerServicification) &&
+               (!is_same_document || is_first_navigation)) {
+      DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
+      factory_bundle_for_prefetch =
+          std::make_unique<URLLoaderFactoryBundleInfo>();
+      network::mojom::URLLoaderFactoryPtrInfo factory_info;
+      CreateNetworkServiceDefaultFactoryInternal(
+          url::Origin(), mojo::MakeRequest(&factory_info));
+      factory_bundle_for_prefetch->default_factory_info() =
+          std::move(factory_info);
+    }
 
+    if (factory_bundle_for_prefetch) {
       // Also set-up URLLoaderFactory for prefetch using the same loader
       // factories. TODO(kinuko): Consider setting this up only when prefetch
       // is used. Currently we have this here to make sure we have non-racy
       // situation (https://crbug.com/849929).
-      DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
+      DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService) ||
+             base::FeatureList::IsEnabled(
+                 blink::features::kServiceWorkerServicification));
       auto* storage_partition = static_cast<StoragePartitionImpl*>(
           BrowserContext::GetStoragePartition(
               GetSiteInstance()->GetBrowserContext(), GetSiteInstance()));
@@ -4330,7 +4359,7 @@
                          storage_partition->GetPrefetchURLLoaderService(),
                          mojo::MakeRequest(&prefetch_loader_factory),
                          frame_tree_node_->frame_tree_node_id(),
-                         CloneSubresourceFactories()));
+                         std::move(factory_bundle_for_prefetch)));
     }
 
     auto find_request = navigation_requests_.find(navigation_id);
@@ -4506,10 +4535,12 @@
 }
 
 bool RenderFrameHostImpl::IsFocused() {
-  return GetRenderWidgetHost()->is_focused() &&
-         frame_tree_->GetFocusedFrame() &&
-         (frame_tree_->GetFocusedFrame() == frame_tree_node() ||
-          frame_tree_->GetFocusedFrame()->IsDescendantOf(frame_tree_node()));
+  if (!GetRenderWidgetHost()->is_focused() || !frame_tree_->GetFocusedFrame())
+    return false;
+
+  RenderFrameHostImpl* focused_rfh =
+      frame_tree_->GetFocusedFrame()->current_frame_host();
+  return focused_rfh == this || focused_rfh->IsDescendantOf(this);
 }
 
 bool RenderFrameHostImpl::UpdatePendingWebUI(const GURL& dest_url,
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index a8ef548..a5598da 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -200,6 +200,7 @@
   RenderProcessHost* GetProcess() override;
   RenderWidgetHostView* GetView() override;
   RenderFrameHostImpl* GetParent() override;
+  bool IsDescendantOf(RenderFrameHost*) override;
   int GetFrameTreeNodeId() override;
   base::UnguessableToken GetDevToolsFrameToken() override;
   const std::string& GetFrameName() override;
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index f4520de1..61536a83 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -29,6 +29,7 @@
 #include "content/browser/frame_host/navigation_request_info.h"
 #include "content/browser/loader/navigation_loader_interceptor.h"
 #include "content/browser/loader/navigation_url_loader_delegate.h"
+#include "content/browser/loader/prefetch_url_loader_service.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
 #include "content/browser/loader/resource_request_info_impl.h"
 #include "content/browser/resource_context_impl.h"
@@ -417,6 +418,8 @@
       storage::FileSystemContext* upload_file_system_context,
       ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
       AppCacheNavigationHandleCore* appcache_handle_core,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder>
+          signed_exchange_prefetch_metric_recorder,
       bool was_request_intercepted) const {
     DCHECK_CURRENTLY_ON(BrowserThread::IO);
     DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
@@ -439,7 +442,8 @@
                 ? nullptr
                 : service_worker_navigation_handle_core),
         base::Unretained(was_request_intercepted ? nullptr
-                                                 : appcache_handle_core));
+                                                 : appcache_handle_core),
+        std::move(signed_exchange_prefetch_metric_recorder));
   }
 
   void CreateNonNetworkServiceURLLoader(
@@ -448,6 +452,8 @@
       std::unique_ptr<NavigationRequestInfo> request_info,
       ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
       AppCacheNavigationHandleCore* appcache_handle_core,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder>
+          signed_exchange_prefetch_metric_recorder,
       const network::ResourceRequest& /* resource_request */,
       network::mojom::URLLoaderRequest url_loader,
       network::mojom::URLLoaderClientPtr url_loader_client) {
@@ -482,7 +488,8 @@
               resource_context_, url_request_context_getter),
           base::BindRepeating(
               &URLLoaderRequestController::CreateURLLoaderThrottles,
-              base::Unretained(this))));
+              base::Unretained(this)),
+          std::move(signed_exchange_prefetch_metric_recorder)));
     }
 
     uint32_t options = GetURLLoaderOptions(request_info->is_main_frame);
@@ -520,6 +527,8 @@
       storage::FileSystemContext* upload_file_system_context,
       ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
       AppCacheNavigationHandleCore* appcache_handle_core,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder>
+          signed_exchange_prefetch_metric_recorder,
       std::unique_ptr<NavigationRequestInfo> request_info,
       std::unique_ptr<NavigationUIData> navigation_ui_data) {
     DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -544,7 +553,8 @@
         base::Unretained(this), base::Unretained(url_request_context_getter),
         base::Unretained(upload_file_system_context),
         base::Unretained(service_worker_navigation_handle_core),
-        base::Unretained(appcache_handle_core));
+        base::Unretained(appcache_handle_core),
+        base::RetainedRef(signed_exchange_prefetch_metric_recorder));
 
     // Requests to Blob scheme won't get redirected to/from other schemes
     // or be intercepted, so we just let it go here.
@@ -608,6 +618,8 @@
           network_loader_factory_info,
       ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
       AppCacheNavigationHandleCore* appcache_handle_core,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder>
+          signed_exchange_prefetch_metric_recorder,
       std::unique_ptr<NavigationRequestInfo> request_info,
       std::unique_ptr<NavigationUIData> navigation_ui_data,
       network::mojom::URLLoaderFactoryPtrInfo factory_for_webui,
@@ -696,7 +708,8 @@
           request_info->begin_params->load_flags, network_loader_factory_,
           base::BindRepeating(
               &URLLoaderRequestController::CreateURLLoaderThrottles,
-              base::Unretained(this))));
+              base::Unretained(this)),
+          signed_exchange_prefetch_metric_recorder));
     }
 
     std::vector<std::unique_ptr<URLLoaderRequestInterceptor>>
@@ -1545,6 +1558,12 @@
       request_info.get(), frame_tree_node_id, allow_download_);
   new_request->transition_type = request_info->common_params.transition;
 
+  auto* partition = static_cast<StoragePartitionImpl*>(storage_partition);
+  scoped_refptr<SignedExchangePrefetchMetricRecorder>
+      signed_exchange_prefetch_metric_recorder =
+          partition->GetPrefetchURLLoaderService()
+              ->signed_exchange_prefetch_metric_recorder();
+
   if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
     DCHECK(!request_controller_);
     request_controller_ = std::make_unique<URLLoaderRequestController>(
@@ -1564,8 +1583,9 @@
             base::RetainedRef(storage_partition->GetURLRequestContext()),
             base::Unretained(storage_partition->GetFileSystemContext()),
             base::Unretained(service_worker_navigation_handle_core),
-            base::Unretained(appcache_handle_core), std::move(request_info),
-            std::move(navigation_ui_data)));
+            base::Unretained(appcache_handle_core),
+            base::RetainedRef(signed_exchange_prefetch_metric_recorder),
+            std::move(request_info), std::move(navigation_ui_data)));
     return;
   }
 
@@ -1584,7 +1604,6 @@
   network::mojom::URLLoaderFactoryPtrInfo proxied_factory_info;
   network::mojom::URLLoaderFactoryRequest proxied_factory_request;
   bool bypass_redirect_checks = false;
-  auto* partition = static_cast<StoragePartitionImpl*>(storage_partition);
   if (frame_tree_node) {
     // |frame_tree_node| may be null in some unit test environments.
     GetContentClient()
@@ -1657,6 +1676,7 @@
           base::Unretained(request_controller_.get()),
           partition->url_loader_factory_getter()->GetNetworkFactoryInfo(),
           service_worker_navigation_handle_core, appcache_handle_core,
+          std::move(signed_exchange_prefetch_metric_recorder),
           std::move(request_info), std::move(navigation_ui_data),
           std::move(factory_for_webui), frame_tree_node_id,
           ServiceManagerConnection::GetForProcess()->GetConnector()->Clone()));
diff --git a/content/browser/loader/prefetch_url_loader.cc b/content/browser/loader/prefetch_url_loader.cc
index 4398fcd9..63f58da 100644
--- a/content/browser/loader/prefetch_url_loader.cc
+++ b/content/browser/loader/prefetch_url_loader.cc
@@ -6,6 +6,7 @@
 
 #include "base/feature_list.h"
 #include "content/browser/web_package/signed_exchange_prefetch_handler.h"
+#include "content/browser/web_package/signed_exchange_prefetch_metric_recorder.h"
 #include "content/browser/web_package/signed_exchange_utils.h"
 #include "content/public/common/content_features.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -33,7 +34,9 @@
     scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory,
     URLLoaderThrottlesGetter url_loader_throttles_getter,
     ResourceContext* resource_context,
-    scoped_refptr<net::URLRequestContextGetter> request_context_getter)
+    scoped_refptr<net::URLRequestContextGetter> request_context_getter,
+    scoped_refptr<SignedExchangePrefetchMetricRecorder>
+        signed_exchange_prefetch_metric_recorder)
     : frame_tree_node_id_getter_(frame_tree_node_id_getter),
       url_(resource_request.url),
       report_raw_headers_(resource_request.report_raw_headers),
@@ -44,7 +47,9 @@
       forwarding_client_(std::move(client)),
       url_loader_throttles_getter_(url_loader_throttles_getter),
       resource_context_(resource_context),
-      request_context_getter_(std::move(request_context_getter)) {
+      request_context_getter_(std::move(request_context_getter)),
+      signed_exchange_prefetch_metric_recorder_(
+          std::move(signed_exchange_prefetch_metric_recorder)) {
   DCHECK(network_loader_factory_);
 
   if (resource_request.request_initiator)
@@ -139,7 +144,8 @@
             throttling_profile_id_, response, std::move(loader_),
             client_binding_.Unbind(), network_loader_factory_,
             request_initiator_, url_, url_loader_throttles_getter_,
-            resource_context_, request_context_getter_, this);
+            resource_context_, request_context_getter_, this,
+            signed_exchange_prefetch_metric_recorder_);
     return;
   }
   forwarding_client_->OnReceiveResponse(response);
diff --git a/content/browser/loader/prefetch_url_loader.h b/content/browser/loader/prefetch_url_loader.h
index b970fffc..7fc4bcb5 100644
--- a/content/browser/loader/prefetch_url_loader.h
+++ b/content/browser/loader/prefetch_url_loader.h
@@ -31,6 +31,7 @@
 class ResourceContext;
 class URLLoaderThrottle;
 class SignedExchangePrefetchHandler;
+class SignedExchangePrefetchMetricRecorder;
 
 // PrefetchURLLoader which basically just keeps draining the data.
 class CONTENT_EXPORT PrefetchURLLoader : public network::mojom::URLLoader,
@@ -57,7 +58,9 @@
       scoped_refptr<network::SharedURLLoaderFactory> network_loader_factory,
       URLLoaderThrottlesGetter url_loader_throttles_getter,
       ResourceContext* resource_context,
-      scoped_refptr<net::URLRequestContextGetter> request_context_getter);
+      scoped_refptr<net::URLRequestContextGetter> request_context_getter,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder>
+          signed_exchange_prefetch_metric_recorder);
   ~PrefetchURLLoader() override;
 
  private:
@@ -122,6 +125,9 @@
 
   GURL new_url_for_redirect_;
 
+  scoped_refptr<SignedExchangePrefetchMetricRecorder>
+      signed_exchange_prefetch_metric_recorder_;
+
   DISALLOW_COPY_AND_ASSIGN(PrefetchURLLoader);
 };
 
diff --git a/content/browser/loader/prefetch_url_loader_service.cc b/content/browser/loader/prefetch_url_loader_service.cc
index b7baa69..497ee22 100644
--- a/content/browser/loader/prefetch_url_loader_service.cc
+++ b/content/browser/loader/prefetch_url_loader_service.cc
@@ -17,12 +17,13 @@
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "third_party/blink/public/common/features.h"
 
 namespace content {
 
 struct PrefetchURLLoaderService::BindContext {
   BindContext(int frame_tree_node_id,
-              scoped_refptr<URLLoaderFactoryBundle> factory)
+              scoped_refptr<network::SharedURLLoaderFactory> factory)
       : frame_tree_node_id(frame_tree_node_id), factory(factory) {}
 
   explicit BindContext(const std::unique_ptr<BindContext>& other)
@@ -32,10 +33,12 @@
   ~BindContext() = default;
 
   const int frame_tree_node_id;
-  scoped_refptr<URLLoaderFactoryBundle> factory;
+  scoped_refptr<network::SharedURLLoaderFactory> factory;
 };
 
-PrefetchURLLoaderService::PrefetchURLLoaderService() = default;
+PrefetchURLLoaderService::PrefetchURLLoaderService()
+    : signed_exchange_prefetch_metric_recorder_(
+          base::MakeRefCounted<SignedExchangePrefetchMetricRecorder>()) {}
 
 void PrefetchURLLoaderService::InitializeResourceContext(
     ResourceContext* resource_context,
@@ -50,10 +53,10 @@
 void PrefetchURLLoaderService::GetFactory(
     network::mojom::URLLoaderFactoryRequest request,
     int frame_tree_node_id,
-    std::unique_ptr<URLLoaderFactoryBundleInfo> factories) {
+    std::unique_ptr<network::SharedURLLoaderFactoryInfo> factories) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   auto factory_bundle =
-      base::MakeRefCounted<URLLoaderFactoryBundle>(std::move(factories));
+      network::SharedURLLoaderFactory::Create(std::move(factories));
   loader_factory_bindings_.AddBinding(
       this, std::move(request),
       std::make_unique<BindContext>(frame_tree_node_id, factory_bundle));
@@ -88,7 +91,8 @@
           base::BindRepeating(
               &PrefetchURLLoaderService::CreateURLLoaderThrottles, this,
               resource_request, frame_tree_node_id_getter),
-          resource_context_, request_context_getter_),
+          resource_context_, request_context_getter_,
+          signed_exchange_prefetch_metric_recorder_),
       std::move(request));
 }
 
@@ -103,7 +107,9 @@
     network::mojom::URLLoaderClientPtr client,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
+  DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService) ||
+         base::FeatureList::IsEnabled(
+             blink::features::kServiceWorkerServicification));
   const auto& dispatch_context = *loader_factory_bindings_.dispatch_context();
   int frame_tree_node_id = dispatch_context.frame_tree_node_id;
   CreateLoaderAndStart(
diff --git a/content/browser/loader/prefetch_url_loader_service.h b/content/browser/loader/prefetch_url_loader_service.h
index 69c2413..2fafbff 100644
--- a/content/browser/loader/prefetch_url_loader_service.h
+++ b/content/browser/loader/prefetch_url_loader_service.h
@@ -8,6 +8,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "content/browser/web_package/signed_exchange_prefetch_metric_recorder.h"
 #include "content/common/content_export.h"
 #include "content/common/url_loader_factory_bundle.h"
 #include "content/public/browser/browser_thread.h"
@@ -20,7 +21,6 @@
 
 namespace network {
 class SharedURLLoaderFactory;
-class URLLoaderFactoryBundleInfo;
 }
 
 namespace content {
@@ -42,9 +42,10 @@
       ResourceContext* resource_context,
       scoped_refptr<net::URLRequestContextGetter> request_context_getter);
 
-  void GetFactory(network::mojom::URLLoaderFactoryRequest request,
-                  int frame_tree_node_id,
-                  std::unique_ptr<URLLoaderFactoryBundleInfo> factory_info);
+  void GetFactory(
+      network::mojom::URLLoaderFactoryRequest request,
+      int frame_tree_node_id,
+      std::unique_ptr<network::SharedURLLoaderFactoryInfo> factory_info);
 
   // Used only when NetworkService is not enabled (or indirectly via the
   // other CreateLoaderAndStart when NetworkService is enabled).
@@ -70,6 +71,11 @@
     prefetch_load_callback_for_testing_ = prefetch_load_callback;
   }
 
+  scoped_refptr<SignedExchangePrefetchMetricRecorder>
+  signed_exchange_prefetch_metric_recorder() {
+    return signed_exchange_prefetch_metric_recorder_;
+  }
+
  private:
   friend class base::DeleteHelper<content::PrefetchURLLoaderService>;
   friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>;
@@ -104,6 +110,9 @@
 
   base::RepeatingClosure prefetch_load_callback_for_testing_;
 
+  scoped_refptr<SignedExchangePrefetchMetricRecorder>
+      signed_exchange_prefetch_metric_recorder_;
+
   DISALLOW_COPY_AND_ASSIGN(PrefetchURLLoaderService);
 };
 
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index fc19913..8ce6d0d 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2431,18 +2431,12 @@
 
   // If |frame| is no longer in fullscreen, remove it and any descendants.
   // See https://fullscreen.spec.whatwg.org.
-  bool changed = false;
-  base::EraseIf(fullscreen_frames_, [&](RenderFrameHostImpl* rfh) {
-    for (auto* current = rfh; current; current = current->GetParent()) {
-      if (current == frame) {
-        changed = true;
-        return true;
-      }
-    }
-    return false;
+  size_t size_before_deletion = fullscreen_frames_.size();
+  base::EraseIf(fullscreen_frames_, [&](RenderFrameHostImpl* current) {
+    return (current == frame || current->IsDescendantOf(frame));
   });
 
-  if (changed)
+  if (size_before_deletion != fullscreen_frames_.size())
     FullscreenFrameSetUpdated();
 }
 
diff --git a/content/browser/web_package/signed_exchange_loader.cc b/content/browser/web_package/signed_exchange_loader.cc
index 0170008..85a3ced 100644
--- a/content/browser/web_package/signed_exchange_loader.cc
+++ b/content/browser/web_package/signed_exchange_loader.cc
@@ -15,9 +15,11 @@
 #include "content/browser/web_package/signed_exchange_cert_fetcher_factory.h"
 #include "content/browser/web_package/signed_exchange_devtools_proxy.h"
 #include "content/browser/web_package/signed_exchange_handler.h"
+#include "content/browser/web_package/signed_exchange_prefetch_metric_recorder.h"
 #include "content/browser/web_package/signed_exchange_utils.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/origin_util.h"
+#include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
 #include "net/http/http_util.h"
@@ -105,7 +107,8 @@
     std::unique_ptr<SignedExchangeDevToolsProxy> devtools_proxy,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     URLLoaderThrottlesGetter url_loader_throttles_getter,
-    base::RepeatingCallback<int(void)> frame_tree_node_id_getter)
+    base::RepeatingCallback<int(void)> frame_tree_node_id_getter,
+    scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder)
     : outer_request_url_(outer_request_url),
       outer_response_timing_info_(
           std::make_unique<ResponseTimingInfo>(outer_response)),
@@ -121,6 +124,7 @@
       url_loader_factory_(std::move(url_loader_factory)),
       url_loader_throttles_getter_(std::move(url_loader_throttles_getter)),
       frame_tree_node_id_getter_(frame_tree_node_id_getter),
+      metric_recorder_(std::move(metric_recorder)),
       weak_factory_(this) {
   DCHECK(signed_exchange_utils::IsSignedExchangeHandlingEnabled());
   DCHECK(outer_request_url_.is_valid());
@@ -279,6 +283,10 @@
     std::unique_ptr<net::SourceStream> payload_stream) {
   UMA_HISTOGRAM_ENUMERATION(kLoadResultHistogram, result);
 
+  if (load_flags_ & net::LOAD_PREFETCH) {
+    metric_recorder_->OnSignedExchangePrefetchFinished(request_url, error);
+  }
+
   if (error) {
     if (error != net::ERR_INVALID_SIGNED_EXCHANGE ||
         !should_redirect_on_failure_ || !request_url.is_valid()) {
diff --git a/content/browser/web_package/signed_exchange_loader.h b/content/browser/web_package/signed_exchange_loader.h
index af731a7..210c3bc 100644
--- a/content/browser/web_package/signed_exchange_loader.h
+++ b/content/browser/web_package/signed_exchange_loader.h
@@ -31,6 +31,7 @@
 class SignedExchangeDevToolsProxy;
 class SignedExchangeHandler;
 class SignedExchangeHandlerFactory;
+class SignedExchangePrefetchMetricRecorder;
 class URLLoaderThrottle;
 class SourceStreamToDataPipe;
 
@@ -60,7 +61,8 @@
       std::unique_ptr<SignedExchangeDevToolsProxy> devtools_proxy,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       URLLoaderThrottlesGetter url_loader_throttles_getter,
-      base::RepeatingCallback<int(void)> frame_tree_node_id_getter);
+      base::RepeatingCallback<int(void)> frame_tree_node_id_getter,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder);
   ~SignedExchangeLoader() override;
 
   bool HasRedirectedToFallbackURL() const {
@@ -154,6 +156,7 @@
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   URLLoaderThrottlesGetter url_loader_throttles_getter_;
   base::RepeatingCallback<int(void)> frame_tree_node_id_getter_;
+  scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder_;
 
   base::Optional<net::SSLInfo> ssl_info_;
 
diff --git a/content/browser/web_package/signed_exchange_prefetch_handler.cc b/content/browser/web_package/signed_exchange_prefetch_handler.cc
index 18c656ab..46efa0e5 100644
--- a/content/browser/web_package/signed_exchange_prefetch_handler.cc
+++ b/content/browser/web_package/signed_exchange_prefetch_handler.cc
@@ -8,6 +8,7 @@
 #include "base/feature_list.h"
 #include "content/browser/web_package/signed_exchange_devtools_proxy.h"
 #include "content/browser/web_package/signed_exchange_loader.h"
+#include "content/browser/web_package/signed_exchange_prefetch_metric_recorder.h"
 #include "content/browser/web_package/signed_exchange_url_loader_factory_for_non_network_service.h"
 #include "content/public/common/content_features.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -32,8 +33,11 @@
     URLLoaderThrottlesGetter loader_throttles_getter,
     ResourceContext* resource_context,
     scoped_refptr<net::URLRequestContextGetter> request_context_getter,
-    network::mojom::URLLoaderClient* forwarding_client)
-    : loader_client_binding_(this), forwarding_client_(forwarding_client) {
+    network::mojom::URLLoaderClient* forwarding_client,
+    scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder)
+    : loader_client_binding_(this),
+      forwarding_client_(forwarding_client),
+      outer_request_url_(outer_request_url) {
   network::mojom::URLLoaderClientEndpointsPtr endpoints =
       network::mojom::URLLoaderClientEndpoints::New(
           std::move(network_loader).PassInterface(),
@@ -49,15 +53,15 @@
     url_loader_factory = std::move(network_loader_factory);
   }
   signed_exchange_loader_ = std::make_unique<SignedExchangeLoader>(
-      outer_request_url, response, std::move(client), std::move(endpoints),
+      outer_request_url_, response, std::move(client), std::move(endpoints),
       std::move(request_initiator), network::mojom::kURLLoadOptionNone,
       load_flags, false /* should_redirect_to_fallback */,
       throttling_profile_id,
       std::make_unique<SignedExchangeDevToolsProxy>(
-          outer_request_url, response, frame_tree_node_id_getter,
+          outer_request_url_, response, frame_tree_node_id_getter,
           base::nullopt /* devtools_navigation_token */, report_raw_headers),
       std::move(url_loader_factory), loader_throttles_getter,
-      frame_tree_node_id_getter);
+      frame_tree_node_id_getter, std::move(metric_recorder));
 }
 
 SignedExchangePrefetchHandler::~SignedExchangePrefetchHandler() = default;
diff --git a/content/browser/web_package/signed_exchange_prefetch_handler.h b/content/browser/web_package/signed_exchange_prefetch_handler.h
index 0c3551f..200ce6b 100644
--- a/content/browser/web_package/signed_exchange_prefetch_handler.h
+++ b/content/browser/web_package/signed_exchange_prefetch_handler.h
@@ -25,6 +25,7 @@
 class ResourceContext;
 class URLLoaderThrottle;
 class SignedExchangeLoader;
+class SignedExchangePrefetchMetricRecorder;
 
 // Attached to each PrefetchURLLoader if the prefetch is for a signed exchange.
 class SignedExchangePrefetchHandler final
@@ -51,7 +52,8 @@
       URLLoaderThrottlesGetter loader_throttles_getter,
       ResourceContext* resource_context,
       scoped_refptr<net::URLRequestContextGetter> request_context_getter,
-      network::mojom::URLLoaderClient* forwarding_client);
+      network::mojom::URLLoaderClient* forwarding_client,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder);
 
   ~SignedExchangePrefetchHandler() override;
 
@@ -83,6 +85,8 @@
 
   network::mojom::URLLoaderClient* forwarding_client_;
 
+  const GURL outer_request_url_;
+
   DISALLOW_COPY_AND_ASSIGN(SignedExchangePrefetchHandler);
 };
 
diff --git a/content/browser/web_package/signed_exchange_prefetch_metric_recorder.cc b/content/browser/web_package/signed_exchange_prefetch_metric_recorder.cc
new file mode 100644
index 0000000..e83902c
--- /dev/null
+++ b/content/browser/web_package/signed_exchange_prefetch_metric_recorder.cc
@@ -0,0 +1,23 @@
+// Copyright 2018 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 "content/browser/web_package/signed_exchange_prefetch_metric_recorder.h"
+
+#include "content/public/browser/browser_thread.h"
+
+namespace content {
+
+SignedExchangePrefetchMetricRecorder::SignedExchangePrefetchMetricRecorder() =
+    default;
+SignedExchangePrefetchMetricRecorder::~SignedExchangePrefetchMetricRecorder() =
+    default;
+
+void SignedExchangePrefetchMetricRecorder::OnSignedExchangePrefetchFinished(
+    const GURL& outer_url,
+    net::Error error) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  // TODO(crbug.com/890180): Actually Report UMA.
+}
+
+}  // namespace content
diff --git a/content/browser/web_package/signed_exchange_prefetch_metric_recorder.h b/content/browser/web_package/signed_exchange_prefetch_metric_recorder.h
new file mode 100644
index 0000000..00566617
--- /dev/null
+++ b/content/browser/web_package/signed_exchange_prefetch_metric_recorder.h
@@ -0,0 +1,35 @@
+// Copyright 2018 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 CONTENT_BROWSER_WEB_PACKAGE_SIGNED_EXCHANGE_PREFETCH_METRIC_RECORDER_H_
+#define CONTENT_BROWSER_WEB_PACKAGE_SIGNED_EXCHANGE_PREFETCH_METRIC_RECORDER_H_
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "net/base/net_errors.h"
+
+class GURL;
+
+namespace content {
+
+// SignedExchangePrefetchMetricRecorder records signed exchange prefetch and
+// its usage metrics.
+class SignedExchangePrefetchMetricRecorder final
+    : public base::RefCountedThreadSafe<SignedExchangePrefetchMetricRecorder> {
+ public:
+  SignedExchangePrefetchMetricRecorder();
+
+  void OnSignedExchangePrefetchFinished(const GURL& outer_url,
+                                        net::Error error);
+
+ private:
+  friend class base::RefCountedThreadSafe<SignedExchangePrefetchMetricRecorder>;
+  ~SignedExchangePrefetchMetricRecorder();
+
+  DISALLOW_COPY_AND_ASSIGN(SignedExchangePrefetchMetricRecorder);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_WEB_PACKAGE_SIGNED_EXCHANGE_PREFETCH_METRIC_RECORDER_H_
diff --git a/content/browser/web_package/signed_exchange_request_handler.cc b/content/browser/web_package/signed_exchange_request_handler.cc
index 4bdb4e2b..da6ea8b7 100644
--- a/content/browser/web_package/signed_exchange_request_handler.cc
+++ b/content/browser/web_package/signed_exchange_request_handler.cc
@@ -10,6 +10,7 @@
 #include "base/feature_list.h"
 #include "content/browser/web_package/signed_exchange_devtools_proxy.h"
 #include "content/browser/web_package/signed_exchange_loader.h"
+#include "content/browser/web_package/signed_exchange_prefetch_metric_recorder.h"
 #include "content/browser/web_package/signed_exchange_utils.h"
 #include "content/common/throttling_url_loader.h"
 #include "content/public/common/content_features.h"
@@ -38,7 +39,8 @@
     bool report_raw_headers,
     int load_flags,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    URLLoaderThrottlesGetter url_loader_throttles_getter)
+    URLLoaderThrottlesGetter url_loader_throttles_getter,
+    scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder)
     : request_initiator_(std::move(request_initiator)),
       url_(url),
       url_loader_options_(url_loader_options),
@@ -49,6 +51,7 @@
       load_flags_(load_flags),
       url_loader_factory_(url_loader_factory),
       url_loader_throttles_getter_(std::move(url_loader_throttles_getter)),
+      metric_recorder_(std::move(metric_recorder)),
       weak_factory_(this) {
   DCHECK(signed_exchange_utils::IsSignedExchangeHandlingEnabled());
 }
@@ -104,7 +107,8 @@
           base::BindRepeating([](int id) { return id; }, frame_tree_node_id_),
           devtools_navigation_token_, report_raw_headers_),
       url_loader_factory_, url_loader_throttles_getter_,
-      base::BindRepeating([](int id) { return id; }, frame_tree_node_id_));
+      base::BindRepeating([](int id) { return id; }, frame_tree_node_id_),
+      metric_recorder_);
   return true;
 }
 
diff --git a/content/browser/web_package/signed_exchange_request_handler.h b/content/browser/web_package/signed_exchange_request_handler.h
index b0037c69..04d1b0c 100644
--- a/content/browser/web_package/signed_exchange_request_handler.h
+++ b/content/browser/web_package/signed_exchange_request_handler.h
@@ -20,6 +20,7 @@
 
 class URLLoaderThrottle;
 class SignedExchangeLoader;
+class SignedExchangePrefetchMetricRecorder;
 
 class SignedExchangeRequestHandler final : public NavigationLoaderInterceptor {
  public:
@@ -38,7 +39,8 @@
       bool report_raw_headers,
       int load_flags,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      URLLoaderThrottlesGetter url_loader_throttles_getter);
+      URLLoaderThrottlesGetter url_loader_throttles_getter,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder);
   ~SignedExchangeRequestHandler() override;
 
   // NavigationLoaderInterceptor implementation
@@ -73,6 +75,7 @@
   const int load_flags_;
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   URLLoaderThrottlesGetter url_loader_throttles_getter_;
+  scoped_refptr<SignedExchangePrefetchMetricRecorder> metric_recorder_;
 
   base::WeakPtrFactory<SignedExchangeRequestHandler> weak_factory_;
 
diff --git a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
index 1be90ba..491651da 100644
--- a/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
+++ b/content/browser/web_package/signed_exchange_request_handler_browsertest.cc
@@ -45,6 +45,7 @@
 #include "services/network/loader_util.h"
 #include "services/network/public/cpp/features.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
+#include "third_party/blink/public/common/features.h"
 
 namespace content {
 
@@ -441,15 +442,20 @@
 }
 
 struct SignedExchangeAcceptHeaderBrowserTestParam {
-  SignedExchangeAcceptHeaderBrowserTestParam(bool sxg_enabled,
-                                             bool sxg_origin_trial_enabled,
-                                             bool sxg_accept_header_enabled)
+  SignedExchangeAcceptHeaderBrowserTestParam(
+      bool sxg_enabled,
+      bool sxg_origin_trial_enabled,
+      bool sxg_accept_header_enabled,
+      bool service_worker_servicification_enabled)
       : sxg_enabled(sxg_enabled),
         sxg_origin_trial_enabled(sxg_origin_trial_enabled),
-        sxg_accept_header_enabled(sxg_accept_header_enabled) {}
+        sxg_accept_header_enabled(sxg_accept_header_enabled),
+        service_worker_servicification_enabled(
+            service_worker_servicification_enabled) {}
   const bool sxg_enabled;
   const bool sxg_origin_trial_enabled;
   const bool sxg_accept_header_enabled;
+  const bool service_worker_servicification_enabled;
 };
 
 class SignedExchangeAcceptHeaderBrowserTest
@@ -477,6 +483,12 @@
     } else {
       disable_features.push_back(features::kSignedHTTPExchangeOriginTrial);
     }
+    if (GetParam().service_worker_servicification_enabled) {
+      enable_features.push_back(blink::features::kServiceWorkerServicification);
+    } else {
+      disable_features.push_back(
+          blink::features::kServiceWorkerServicification);
+    }
     feature_list_.InitWithFeatures(enable_features, disable_features);
 
     enabled_https_server_.ServeFilesFromSourceDirectory("content/test/data");
@@ -863,13 +875,21 @@
     SignedExchangeAcceptHeaderBrowserTest,
     SignedExchangeAcceptHeaderBrowserTest,
     testing::Values(
-        SignedExchangeAcceptHeaderBrowserTestParam(false, false, false),
-        SignedExchangeAcceptHeaderBrowserTestParam(false, false, true),
-        SignedExchangeAcceptHeaderBrowserTestParam(false, true, false),
-        SignedExchangeAcceptHeaderBrowserTestParam(false, true, true),
-        SignedExchangeAcceptHeaderBrowserTestParam(true, false, false),
-        SignedExchangeAcceptHeaderBrowserTestParam(true, false, true),
-        SignedExchangeAcceptHeaderBrowserTestParam(true, true, false),
-        SignedExchangeAcceptHeaderBrowserTestParam(true, true, true)));
+        SignedExchangeAcceptHeaderBrowserTestParam(false, false, false, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(false, false, false, true),
+        SignedExchangeAcceptHeaderBrowserTestParam(false, false, true, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(false, false, true, true),
+        SignedExchangeAcceptHeaderBrowserTestParam(false, true, false, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(false, true, false, true),
+        SignedExchangeAcceptHeaderBrowserTestParam(false, true, true, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(false, true, true, true),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, false, false, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, false, false, true),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, false, true, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, false, true, true),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, true, false, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, true, false, true),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, true, true, false),
+        SignedExchangeAcceptHeaderBrowserTestParam(true, true, true, true)));
 
 }  // namespace content
diff --git a/content/public/browser/render_frame_host.h b/content/public/browser/render_frame_host.h
index fb2c98ed..fb02582 100644
--- a/content/public/browser/render_frame_host.h
+++ b/content/public/browser/render_frame_host.h
@@ -120,6 +120,13 @@
   // current RenderFrameHost.
   virtual RenderFrameHost* GetParent() = 0;
 
+  // Returns whether or not this RenderFrameHost is a descendant of |ancestor|.
+  // This is equivalent to check that |ancestor| is reached by iterating on
+  // GetParent().
+  // This is a strict relationship, a RenderFrameHost is never an ancestor of
+  // itself.
+  virtual bool IsDescendantOf(RenderFrameHost* ancestor) = 0;
+
   // Returns the FrameTreeNode ID for this frame. This ID is browser-global and
   // uniquely identifies a frame that hosts content. The identifier is fixed at
   // the creation of the frame and stays constant for the lifetime of the frame.
diff --git a/content/public/common/previews_state.h b/content/public/common/previews_state.h
index e87edd6..75e96caf 100644
--- a/content/public/common/previews_state.h
+++ b/content/public/common/previews_state.h
@@ -44,7 +44,9 @@
       1 << 8,  // Request that an offline page be used if one is stored.
   LITE_PAGE_REDIRECT_ON = 1 << 9,  // Allow the browser to redirect the resource
                                    // to a Lite Page server.
-  PREVIEWS_STATE_LAST = LITE_PAGE_REDIRECT_ON
+  LAZY_IMAGE_LOAD_DEFERRED = 1 << 10,  // Request the placeholder version of an
+                                       // image that was deferred by lazyload.
+  PREVIEWS_STATE_LAST = LAZY_IMAGE_LOAD_DEFERRED
 };
 
 // Combination of all previews that are guaranteed not to provide partial
@@ -73,6 +75,8 @@
                             blink::WebURLRequest::kOfflinePageOn);
 STATIC_ASSERT_PREVIEWS_ENUM(LITE_PAGE_REDIRECT_ON,
                             blink::WebURLRequest::kLitePageRedirectOn);
+STATIC_ASSERT_PREVIEWS_ENUM(LAZY_IMAGE_LOAD_DEFERRED,
+                            blink::WebURLRequest::kLazyImageLoadDeferred);
 STATIC_ASSERT_PREVIEWS_ENUM(PREVIEWS_STATE_LAST,
                             blink::WebURLRequest::kPreviewsStateLast);
 
diff --git a/content/renderer/OWNERS b/content/renderer/OWNERS
index 13765f8..63ad4d3 100644
--- a/content/renderer/OWNERS
+++ b/content/renderer/OWNERS
@@ -1,3 +1,4 @@
+dcheng@chromium.org
 haraken@chromium.org
 
 # These are for the common case of adding or renaming files. If you're doing
diff --git a/content/renderer/indexed_db/webidbdatabase_impl.cc b/content/renderer/indexed_db/webidbdatabase_impl.cc
index aea8e184..ae54492 100644
--- a/content/renderer/indexed_db/webidbdatabase_impl.cc
+++ b/content/renderer/indexed_db/webidbdatabase_impl.cc
@@ -48,16 +48,14 @@
 namespace {
 
 std::vector<IndexedDBIndexKeys> ConvertWebIndexKeys(
-    const WebVector<long long>& index_ids,
-    const WebVector<WebIDBDatabase::WebIndexKeys>& index_keys) {
-  DCHECK_EQ(index_ids.size(), index_keys.size());
+    const WebVector<blink::WebIDBIndexKeys>& index_keys) {
   std::vector<IndexedDBIndexKeys> result;
-  result.reserve(index_ids.size());
-  for (size_t i = 0, len = index_ids.size(); i < len; ++i) {
-    result.emplace_back(index_ids[i], std::vector<IndexedDBKey>());
+  result.reserve(index_keys.size());
+  for (size_t i = 0, len = index_keys.size(); i < len; ++i) {
+    result.emplace_back(index_keys[i].first, std::vector<IndexedDBKey>());
     std::vector<IndexedDBKey>& result_keys = result.back().second;
-    result_keys.reserve(index_keys[i].size());
-    for (const WebIDBKey& index_key : index_keys[i])
+    result_keys.reserve(index_keys[i].second.size());
+    for (const WebIDBKey& index_key : index_keys[i].second)
       result_keys.emplace_back(IndexedDBKeyBuilder::Build(index_key.View()));
   }
   return result;
@@ -165,15 +163,15 @@
                     max_count, GetCallbacksProxy(std::move(callbacks_impl)));
 }
 
-void WebIDBDatabaseImpl::Put(long long transaction_id,
-                             long long object_store_id,
-                             const blink::WebData& value,
-                             const WebVector<WebBlobInfo>& web_blob_info,
-                             WebIDBKeyView web_primary_key,
-                             blink::WebIDBPutMode put_mode,
-                             WebIDBCallbacks* callbacks,
-                             const WebVector<long long>& index_ids,
-                             WebVector<WebIndexKeys> index_keys) {
+void WebIDBDatabaseImpl::Put(
+    long long transaction_id,
+    long long object_store_id,
+    const blink::WebData& value,
+    const WebVector<WebBlobInfo>& web_blob_info,
+    WebIDBKeyView web_primary_key,
+    blink::WebIDBPutMode put_mode,
+    WebIDBCallbacks* callbacks,
+    const WebVector<blink::WebIDBIndexKeys>& index_keys) {
   IndexedDBKey key = IndexedDBKeyBuilder::Build(web_primary_key);
 
   if (value.size() + key.size_estimate() > max_put_value_size_) {
@@ -219,7 +217,7 @@
   auto callbacks_impl = std::make_unique<IndexedDBCallbacksImpl>(
       base::WrapUnique(callbacks), transaction_id, nullptr);
   database_->Put(transaction_id, object_store_id, std::move(mojo_value), key,
-                 put_mode, ConvertWebIndexKeys(index_ids, index_keys),
+                 put_mode, ConvertWebIndexKeys(index_keys),
                  GetCallbacksProxy(std::move(callbacks_impl)));
 }
 
@@ -227,11 +225,10 @@
     long long transaction_id,
     long long object_store_id,
     WebIDBKeyView primary_key,
-    const WebVector<long long>& index_ids,
-    const WebVector<WebIndexKeys>& index_keys) {
+    const WebVector<blink::WebIDBIndexKeys>& index_keys) {
   database_->SetIndexKeys(transaction_id, object_store_id,
                           IndexedDBKeyBuilder::Build(primary_key),
-                          ConvertWebIndexKeys(index_ids, index_keys));
+                          ConvertWebIndexKeys(index_keys));
 }
 
 void WebIDBDatabaseImpl::SetIndexesReady(
diff --git a/content/renderer/indexed_db/webidbdatabase_impl.h b/content/renderer/indexed_db/webidbdatabase_impl.h
index 95fed9c..e33154d 100644
--- a/content/renderer/indexed_db/webidbdatabase_impl.h
+++ b/content/renderer/indexed_db/webidbdatabase_impl.h
@@ -80,13 +80,11 @@
            blink::WebIDBKeyView primary_key,
            blink::WebIDBPutMode,
            blink::WebIDBCallbacks*,
-           const blink::WebVector<long long>& index_ids,
-           blink::WebVector<WebIndexKeys>) override;
+           const blink::WebVector<blink::WebIDBIndexKeys>&) override;
   void SetIndexKeys(long long transaction_id,
                     long long object_store_id,
                     blink::WebIDBKeyView primary_key,
-                    const blink::WebVector<long long>& index_ids,
-                    const blink::WebVector<WebIndexKeys>&) override;
+                    const blink::WebVector<blink::WebIDBIndexKeys>&) override;
   void SetIndexesReady(long long transaction_id,
                        long long object_store_id,
                        const blink::WebVector<long long>& index_ids) override;
diff --git a/content/renderer/indexed_db/webidbdatabase_impl_unittest.cc b/content/renderer/indexed_db/webidbdatabase_impl_unittest.cc
index be6629f1..39bc0f26e 100644
--- a/content/renderer/indexed_db/webidbdatabase_impl_unittest.cc
+++ b/content/renderer/indexed_db/webidbdatabase_impl_unittest.cc
@@ -65,8 +65,7 @@
   const WebIDBKey idb_key = WebIDBKey::CreateNumber(0);
   database_impl.Put(transaction_id, object_store_id, value, web_blob_info,
                     idb_key.View(), blink::kWebIDBPutModeAddOrUpdate,
-                    &callbacks, WebVector<long long>(),
-                    WebVector<WebVector<WebIDBKey>>());
+                    &callbacks, WebVector<blink::WebIDBIndexKeys>());
 }
 
 TEST_F(WebIDBDatabaseImplTest, KeyAndValueSizeTest) {
@@ -91,7 +90,7 @@
   database_impl.max_put_value_size_ = kMaxValueSizeForTesting;
   database_impl.Put(transaction_id, object_store_id, value, web_blob_info,
                     key.View(), blink::kWebIDBPutModeAddOrUpdate, &callbacks,
-                    WebVector<long long>(), WebVector<WebVector<WebIDBKey>>());
+                    WebVector<blink::WebIDBIndexKeys>());
 }
 
 }  // namespace content
diff --git a/content/renderer/loader/child_url_loader_factory_bundle.cc b/content/renderer/loader/child_url_loader_factory_bundle.cc
index 276f496f..0847553 100644
--- a/content/renderer/loader/child_url_loader_factory_bundle.cc
+++ b/content/renderer/loader/child_url_loader_factory_bundle.cc
@@ -113,14 +113,12 @@
 ChildURLLoaderFactoryBundleInfo::ChildURLLoaderFactoryBundleInfo() = default;
 
 ChildURLLoaderFactoryBundleInfo::ChildURLLoaderFactoryBundleInfo(
-    std::unique_ptr<URLLoaderFactoryBundleInfo> base_info,
-    network::mojom::URLLoaderFactoryPtrInfo prefetch_loader_factory_info)
+    std::unique_ptr<URLLoaderFactoryBundleInfo> base_info)
     : URLLoaderFactoryBundleInfo(
           std::move(base_info->default_factory_info()),
           std::move(base_info->scheme_specific_factory_infos()),
           std::move(base_info->initiator_specific_factory_infos()),
-          base_info->bypass_redirect_checks()),
-      prefetch_loader_factory_info_(std::move(prefetch_loader_factory_info)) {}
+          base_info->bypass_redirect_checks()) {}
 
 ChildURLLoaderFactoryBundleInfo::ChildURLLoaderFactoryBundleInfo(
     network::mojom::URLLoaderFactoryPtrInfo default_factory_info,
@@ -257,6 +255,11 @@
   }
 }
 
+void ChildURLLoaderFactoryBundle::SetPrefetchLoaderFactory(
+    network::mojom::URLLoaderFactoryPtr prefetch_loader_factory) {
+  prefetch_loader_factory_ = std::move(prefetch_loader_factory);
+}
+
 bool ChildURLLoaderFactoryBundle::IsHostChildURLLoaderFactoryBundle() const {
   return false;
 }
diff --git a/content/renderer/loader/child_url_loader_factory_bundle.h b/content/renderer/loader/child_url_loader_factory_bundle.h
index e4a73e90..a6b4292 100644
--- a/content/renderer/loader/child_url_loader_factory_bundle.h
+++ b/content/renderer/loader/child_url_loader_factory_bundle.h
@@ -34,9 +34,8 @@
       PossiblyAssociatedInterfacePtrInfo<network::mojom::URLLoaderFactory>;
 
   ChildURLLoaderFactoryBundleInfo();
-  ChildURLLoaderFactoryBundleInfo(
-      std::unique_ptr<URLLoaderFactoryBundleInfo> base_info,
-      network::mojom::URLLoaderFactoryPtrInfo prefetch_loader_factory_info);
+  explicit ChildURLLoaderFactoryBundleInfo(
+      std::unique_ptr<URLLoaderFactoryBundleInfo> base_info);
   ChildURLLoaderFactoryBundleInfo(
       network::mojom::URLLoaderFactoryPtrInfo default_factory_info,
       SchemeMap scheme_specific_factory_infos,
@@ -107,6 +106,8 @@
   void Update(std::unique_ptr<ChildURLLoaderFactoryBundleInfo> info,
               base::Optional<std::vector<mojom::TransferrableURLLoaderPtr>>
                   subresource_overrides);
+  void SetPrefetchLoaderFactory(
+      network::mojom::URLLoaderFactoryPtr prefetch_loader_factory);
 
   virtual bool IsHostChildURLLoaderFactoryBundle() const;
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 1237f83..d0508ef 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4983,6 +4983,7 @@
       // in the request lifetime, in LocalFrame::MaybeAllowImagePlaceholder(),
       // so don't add the Client Lo-Fi bit to the request here.
       request_previews_state &= ~(WebURLRequest::kClientLoFiOn);
+      request_previews_state &= ~(WebURLRequest::kLazyImageLoadDeferred);
       if (request_previews_state == WebURLRequest::kPreviewsUnspecified)
         request_previews_state = WebURLRequest::kPreviewsOff;
 
@@ -6574,10 +6575,13 @@
 
   if (info) {
     loader_factories_->Update(
-        std::make_unique<ChildURLLoaderFactoryBundleInfo>(
-            std::move(info), prefetch_loader_factory.PassInterface()),
+        std::make_unique<ChildURLLoaderFactoryBundleInfo>(std::move(info)),
         std::move(subresource_overrides));
   }
+  if (prefetch_loader_factory) {
+    loader_factories_->SetPrefetchLoaderFactory(
+        std::move(prefetch_loader_factory));
+  }
 }
 
 void RenderFrameImpl::UpdateEncoding(WebFrame* frame,
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 5a3d0d9..c77ffd56 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -634,8 +634,7 @@
     loader_factories_ = base::MakeRefCounted<HostChildURLLoaderFactoryBundle>(
         main_thread_task_runner_);
     loader_factories_->Update(std::make_unique<ChildURLLoaderFactoryBundleInfo>(
-                                  std::move(subresource_loaders),
-                                  nullptr /* prefetch_loader_factory_info */),
+                                  std::move(subresource_loaders)),
                               base::nullopt /* subresource_overrides */);
   }
 
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index 1c0fae8b..241a2297 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -375,6 +375,7 @@
   // we can't simply fallback to the network here. It is because the CORS
   // preflight logic is implemented in Blink. So we return a "fallback required"
   // response to Blink.
+  // TODO(falken): Remove this mechanism after OOB-CORS ships.
   if ((resource_request_.fetch_request_mode ==
            network::mojom::FetchRequestMode::kCORS ||
        resource_request_.fetch_request_mode ==
@@ -385,6 +386,11 @@
     TRACE_EVENT_WITH_FLOW0(
         "ServiceWorker", "ServiceWorkerSubresourceLoader::OnFallback", this,
         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
+    //  Add "Service Worker Fallback Required" which DevTools knows means to not
+    //  show the response in the Network tab as it's just an internal
+    //  implementation mechanism.
+    response_head_.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
+        "HTTP/1.1 400 Service Worker Fallback Required");
     response_head_.was_fetched_via_service_worker = true;
     response_head_.was_fallback_required_by_service_worker = true;
     CommitResponseHeaders();
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index 3f6a0ba6..b4b4ab5 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -1265,6 +1265,10 @@
               info.was_fetched_via_service_worker);
     EXPECT_EQ(test.expected_was_fallback_required_by_service_worker,
               info.was_fallback_required_by_service_worker);
+    if (info.was_fallback_required_by_service_worker) {
+      EXPECT_EQ("HTTP/1.1 400 Service Worker Fallback Required",
+                info.headers->GetStatusLine());
+    }
   }
 }
 
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
index 5a15563..8b9dfc0 100644
--- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -304,8 +304,7 @@
 
     subresource_loader_factories_->Update(
         std::make_unique<ChildURLLoaderFactoryBundleInfo>(
-            std::move(factory_bundle),
-            nullptr /* prefetch_loader_factory_info */),
+            std::move(factory_bundle)),
         base::nullopt /* subresource_overrides */);
   }
 
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 361c05c..ea2d8125 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -367,8 +367,8 @@
 
   if (is_win) {
     sources += [
-      "common/v8_breakpad_support_win.cc",
-      "common/v8_breakpad_support_win.h",
+      "common/v8_crashpad_support_win.cc",
+      "common/v8_crashpad_support_win.h",
     ]
   }
 
diff --git a/content/shell/app/shell_main_delegate.cc b/content/shell/app/shell_main_delegate.cc
index 416c1be..36fc801 100644
--- a/content/shell/app/shell_main_delegate.cc
+++ b/content/shell/app/shell_main_delegate.cc
@@ -79,9 +79,10 @@
 
 #if defined(OS_WIN)
 #include <windows.h>
+
 #include <initguid.h>
 #include "base/logging_win.h"
-#include "content/shell/common/v8_breakpad_support_win.h"
+#include "content/shell/common/v8_crashpad_support_win.h"
 #endif
 
 #if defined(OS_POSIX) && !defined(OS_MACOSX)
@@ -163,7 +164,7 @@
   // Enable trace control and transport through event tracing for Windows.
   logging::LogEventProvider::Initialize(kContentShellProviderName);
 
-  v8_breakpad_support::SetUp();
+  v8_crashpad_support::SetUp();
 #endif
 #if defined(OS_LINUX)
   breakpad::SetFirstChanceExceptionHandler(v8::V8::TryHandleSignal);
diff --git a/content/shell/common/v8_breakpad_support_win.h b/content/shell/common/v8_breakpad_support_win.h
deleted file mode 100644
index a10f34a..0000000
--- a/content/shell/common/v8_breakpad_support_win.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2014 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 CONTENT_SHELL_COMMON_V8_BREAKPAD_SUPPORT_WIN_H_
-#define CONTENT_SHELL_COMMON_V8_BREAKPAD_SUPPORT_WIN_H_
-
-namespace v8_breakpad_support {
-
-// Hook up V8 to breakpad.
-void SetUp();
-
-}  // namespace v8_breakpad_support
-
-#endif  // CONTENT_SHELL_COMMON_V8_BREAKPAD_SUPPORT_WIN_H_
diff --git a/content/shell/common/v8_breakpad_support_win.cc b/content/shell/common/v8_crashpad_support_win.cc
similarity index 88%
rename from content/shell/common/v8_breakpad_support_win.cc
rename to content/shell/common/v8_crashpad_support_win.cc
index 584b3ad1..33eab60 100644
--- a/content/shell/common/v8_breakpad_support_win.cc
+++ b/content/shell/common/v8_crashpad_support_win.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/shell/common/v8_breakpad_support_win.h"
+#include "content/shell/common/v8_crashpad_support_win.h"
 
 #include <windows.h>
 
 #include "base/logging.h"
 #include "gin/public/debug.h"
 
-namespace v8_breakpad_support {
+namespace v8_crashpad_support {
 
 void SetUp() {
 #ifdef _WIN64
@@ -29,4 +29,4 @@
 #endif
 }
 
-}  // namespace v8_breakpad_support
+}  // namespace v8_crashpad_support
diff --git a/content/shell/common/v8_crashpad_support_win.h b/content/shell/common/v8_crashpad_support_win.h
new file mode 100644
index 0000000..159349f
--- /dev/null
+++ b/content/shell/common/v8_crashpad_support_win.h
@@ -0,0 +1,15 @@
+// Copyright (c) 2014 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 CONTENT_SHELL_COMMON_V8_CRASHPAD_SUPPORT_WIN_H_
+#define CONTENT_SHELL_COMMON_V8_CRASHPAD_SUPPORT_WIN_H_
+
+namespace v8_crashpad_support {
+
+// Hook up V8 to crashpad.
+void SetUp();
+
+}  // namespace v8_crashpad_support
+
+#endif  // CONTENT_SHELL_COMMON_V8_CRASHPAD_SUPPORT_WIN_H_
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc
index 2140fbf..b68e76f 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.cc
+++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -9,7 +9,7 @@
 
 // TODO(crbug.com/893314) : Remove this flag.
 const base::Feature kClosingLastIncognitoTab{"ClosingLastIncognitoTab",
-                                             base::FEATURE_ENABLED_BY_DEFAULT};
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kCopyImage{"CopyImage", base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/ios/web/public/web_state/ui/crw_web_view_proxy.h b/ios/web/public/web_state/ui/crw_web_view_proxy.h
index 1359758..ec1a1430 100644
--- a/ios/web/public/web_state/ui/crw_web_view_proxy.h
+++ b/ios/web/public/web_state/ui/crw_web_view_proxy.h
@@ -36,6 +36,10 @@
 // controlled manner.
 @property(nonatomic, readonly) CRWWebViewScrollViewProxy* scrollViewProxy;
 
+// A Boolean value indicating whether horizontal swipe gestures will trigger
+// back-forward list navigations.
+@property(nonatomic) BOOL allowsBackForwardNavigationGestures;
+
 // Returns the webview's gesture recognizers.
 @property(nonatomic, readonly) NSArray* gestureRecognizers;
 
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h
index 301c0c1..8c43a40 100644
--- a/ios/web/web_state/ui/crw_web_controller.h
+++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -103,6 +103,10 @@
 // NO after wasHidden() call.
 @property(nonatomic, assign, getter=isVisible) BOOL visible;
 
+// A Boolean value indicating whether horizontal swipe gestures will trigger
+// back-forward list navigations.
+@property(nonatomic) BOOL allowsBackForwardNavigationGestures;
+
 // Designated initializer. Initializes web controller with |webState|. The
 // calling code must retain the ownership of |webState|.
 - (instancetype)initWithWebState:(web::WebStateImpl*)webState;
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 68b4b91a..7290011 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -960,6 +960,8 @@
 @synthesize nativeProvider = _nativeProvider;
 @synthesize swipeRecognizerProvider = _swipeRecognizerProvider;
 @synthesize webViewProxy = _webViewProxy;
+@synthesize allowsBackForwardNavigationGestures =
+    _allowsBackForwardNavigationGestures;
 
 - (instancetype)initWithWebState:(WebStateImpl*)webState {
   self = [super init];
@@ -4082,6 +4084,8 @@
   for (NSString* keyPath in self.WKWebViewObservers) {
     [_webView addObserver:self forKeyPath:keyPath options:0 context:nullptr];
   }
+  _webView.allowsBackForwardNavigationGestures =
+      _allowsBackForwardNavigationGestures;
   _injectedScriptManagers = [[NSMutableSet alloc] init];
   [self setDocumentURL:_defaultURL context:nullptr];
 }
@@ -5740,6 +5744,16 @@
       BackForwardNavigationType::BACK_FORWARD_NAVIGATION_TYPE_COUNT);
 }
 
+- (void)setAllowsBackForwardNavigationGestures:
+    (BOOL)allowsBackForwardNavigationGestures {
+  // Store it to an instance variable as well as
+  // _webView.allowsBackForwardNavigationGestures because _webView may be nil.
+  // When _webView is nil, it will be set later in -setWebView:.
+  _allowsBackForwardNavigationGestures = allowsBackForwardNavigationGestures;
+  _webView.allowsBackForwardNavigationGestures =
+      allowsBackForwardNavigationGestures;
+}
+
 #pragma mark -
 #pragma mark Testing-Only Methods
 
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm
index 7491c4a..06e30cd 100644
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -242,6 +242,8 @@
                        context:nullptr];
     [[result stub] removeObserver:web_controller() forKeyPath:OCMOCK_ANY];
     [[result stub] evaluateJavaScript:OCMOCK_ANY completionHandler:OCMOCK_ANY];
+    // CRWWebController sets this property to NO by default.
+    [[result stub] setAllowsBackForwardNavigationGestures:NO];
 
     return result;
   }
@@ -335,6 +337,15 @@
   EXPECT_FALSE(observer.did_finish_navigation_info());
 }
 
+// Tests allowsBackForwardNavigationGestures default value and setting this
+// property to YES.
+TEST_P(CRWWebControllerTest, SetAllowsBackForwardNavigationGestures) {
+  OCMExpect([mock_web_view_ setAllowsBackForwardNavigationGestures:YES]);
+  EXPECT_FALSE(web_controller().allowsBackForwardNavigationGestures);
+  web_controller().allowsBackForwardNavigationGestures = YES;
+  EXPECT_TRUE(web_controller().allowsBackForwardNavigationGestures);
+}
+
 INSTANTIATE_TEST_CASES(CRWWebControllerTest);
 
 // Test fixture to test |WebState::SetShouldSuppressDialogs|.
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
index 8519e580..7ba42f5 100644
--- a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
+++ b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
@@ -90,6 +90,16 @@
   return _contentViewScrollViewProxy;
 }
 
+- (BOOL)allowsBackForwardNavigationGestures {
+  return _webController.allowsBackForwardNavigationGestures;
+}
+
+- (void)setAllowsBackForwardNavigationGestures:
+    (BOOL)allowsBackForwardNavigationGestures {
+  _webController.allowsBackForwardNavigationGestures =
+      allowsBackForwardNavigationGestures;
+}
+
 - (CGRect)bounds {
   return [_contentView bounds];
 }
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm
index cff8ff1..1712f5f 100644
--- a/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm
@@ -6,6 +6,7 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/web/web_state/ui/crw_web_controller.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 #import "third_party/ocmock/OCMock/OCMock.h"
@@ -64,4 +65,21 @@
   EXPECT_TRUE(fakeContentView.shouldUseViewContentInset);
 }
 
+// Tests allowsBackForwardNavigationGestures property is delegated to
+// CWVWebController.
+TEST_F(CRWWebViewProxyImplTest, AllowsBackForwardNavigationGestures) {
+  CRWWebController* mockWebController =
+      OCMStrictClassMock([CRWWebController class]);
+  CRWWebViewProxyImpl* proxy =
+      [[CRWWebViewProxyImpl alloc] initWithWebController:mockWebController];
+
+  OCMStub([mockWebController allowsBackForwardNavigationGestures])
+      .andReturn(YES);
+  EXPECT_TRUE(proxy.allowsBackForwardNavigationGestures);
+
+  OCMExpect([mockWebController setAllowsBackForwardNavigationGestures:YES]);
+  proxy.allowsBackForwardNavigationGestures = YES;
+  EXPECT_OCMOCK_VERIFY((id)mockWebController);
+}
+
 }  // namespace
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm
index ea6690c..8462df6 100644
--- a/ios/web_view/internal/cwv_web_view.mm
+++ b/ios/web_view/internal/cwv_web_view.mm
@@ -187,6 +187,16 @@
   return self;
 }
 
+- (BOOL)allowsBackForwardNavigationGestures {
+  return _webState->GetWebViewProxy().allowsBackForwardNavigationGestures;
+}
+
+- (void)setAllowsBackForwardNavigationGestures:
+    (BOOL)allowsBackForwardNavigationGestures {
+  _webState->GetWebViewProxy().allowsBackForwardNavigationGestures =
+      allowsBackForwardNavigationGestures;
+}
+
 - (void)dealloc {
   if (_webState && _webStateObserver) {
     _webState->RemoveObserver(_webStateObserver.get());
@@ -554,6 +564,10 @@
     [_webState->GetView() removeFromSuperview];
   }
 
+  BOOL allowsBackForwardNavigationGestures =
+      _webState &&
+      _webState->GetWebViewProxy().allowsBackForwardNavigationGestures;
+
   web::WebState::CreateParams webStateCreateParams(_configuration.browserState);
   if (sessionStorage) {
     _webState = web::WebState::CreateWithStorageSession(webStateCreateParams,
@@ -584,6 +598,9 @@
     _webState->AddScriptCommandCallback(pair.second, pair.first);
   }
 
+  _webState->GetWebViewProxy().allowsBackForwardNavigationGestures =
+      allowsBackForwardNavigationGestures;
+
   _scrollView.proxy = _webState.get()->GetWebViewProxy().scrollViewProxy;
 
   if (_translationController) {
diff --git a/ios/web_view/internal/cwv_web_view_configuration.mm b/ios/web_view/internal/cwv_web_view_configuration.mm
index 217d557..b533d32 100644
--- a/ios/web_view/internal/cwv_web_view_configuration.mm
+++ b/ios/web_view/internal/cwv_web_view_configuration.mm
@@ -77,8 +77,11 @@
 }  // namespace
 
 + (void)shutDown {
-  [gDefaultConfiguration shutDown];
+  // Incognito should be shut down first because it holds onto members of the
+  // non-incognito browser state. This ensures that the non-incognito browser
+  // state will not leave any dangling references.
   [gIncognitoConfiguration shutDown];
+  [gDefaultConfiguration shutDown];
 }
 
 + (instancetype)defaultConfiguration {
diff --git a/ios/web_view/public/cwv_web_view.h b/ios/web_view/public/cwv_web_view.h
index e71532a..d16921d6 100644
--- a/ios/web_view/public/cwv_web_view.h
+++ b/ios/web_view/public/cwv_web_view.h
@@ -87,6 +87,10 @@
 // The scroll view associated with the web view.
 @property(nonatomic, readonly) CWVScrollView* scrollView;
 
+// A Boolean value indicating whether horizontal swipe gestures will trigger
+// back-forward list navigations.
+@property(nonatomic) BOOL allowsBackForwardNavigationGestures;
+
 // The User Agent product string used to build the full User Agent.
 + (NSString*)userAgentProduct;
 
diff --git a/media/blink/webcontentdecryptionmodulesession_impl.cc b/media/blink/webcontentdecryptionmodulesession_impl.cc
index 941ca3c..bc1bb19 100644
--- a/media/blink/webcontentdecryptionmodulesession_impl.cc
+++ b/media/blink/webcontentdecryptionmodulesession_impl.cc
@@ -440,15 +440,6 @@
   DCHECK(!session_id_.empty());
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // TODO(http://crbug.com/616166). Once all supported CDMs allow remove() on
-  // temporary sessions, remove this code.
-  if (!is_persistent_session_ && !IsClearKey(adapter_->GetKeySystem())) {
-    result.CompleteWithError(
-        blink::kWebContentDecryptionModuleExceptionTypeError, 0,
-        "remove() on temporary sessions is not supported by this key system.");
-    return;
-  }
-
   adapter_->RemoveSession(
       session_id_,
       std::unique_ptr<SimpleCdmPromise>(new CdmResultPromise<>(
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
index 936d715..e3e7c8de 100644
--- a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
@@ -620,12 +620,9 @@
     NOTIFY_ERROR(INVALID_ARGUMENT);
     return;
   }
-  if (reset_pending_) {
-    FinishReset();
-  }
-
   int adjusted_coded_width = stride * 8 / plane_horiz_bits_per_pixel;
   if (image_processor_device_ && !image_processor_) {
+    DCHECK_EQ(kAwaitingPictureBuffers, decoder_state_);
     // This is the first buffer import. Create the image processor and change
     // the decoder state. The client may adjust the coded width. We don't have
     // the final coded size in AssignPictureBuffers yet. Use the adjusted coded
@@ -636,10 +633,13 @@
     egl_image_size_.set_width(adjusted_coded_width);
     if (!CreateImageProcessor())
       return;
-    DCHECK_EQ(kAwaitingPictureBuffers, decoder_state_);
   }
   DCHECK_EQ(egl_image_size_.width(), adjusted_coded_width);
 
+  if (reset_pending_) {
+    FinishReset();
+  }
+
   if (decoder_state_ == kAwaitingPictureBuffers) {
     decoder_state_ = kDecoding;
     DVLOGF(3) << "Change state to kDecoding";
@@ -1452,15 +1452,7 @@
         return false;
       }
     } else {
-      output_record.state = kAtClient;
-      decoder_frames_at_client_++;
-      // TODO(hubbe): Insert correct color space. http://crbug.com/647725
-      const Picture picture(output_record.picture_id, bitstream_buffer_id,
-                            gfx::Rect(visible_size_), gfx::ColorSpace(), false);
-      pending_picture_ready_.push(
-          PictureRecord(output_record.cleared, picture));
-      SendPictureReady();
-      output_record.cleared = true;
+      SendBufferToClient(buf->BufferId(), bitstream_buffer_id);
     }
   }
   if (buf->IsLast()) {
@@ -2546,6 +2538,24 @@
   return success;
 }
 
+void V4L2VideoDecodeAccelerator::SendBufferToClient(
+    size_t buffer_index,
+    int32_t bitstream_buffer_id) {
+  DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread());
+  DCHECK_GE(bitstream_buffer_id, 0);
+  OutputRecord& output_record = output_buffer_map_[buffer_index];
+
+  output_record.state = kAtClient;
+  decoder_frames_at_client_++;
+  // TODO(hubbe): Insert correct color space. http://crbug.com/647725
+  const Picture picture(output_record.picture_id, bitstream_buffer_id,
+                        gfx::Rect(visible_size_), gfx::ColorSpace(), false);
+  pending_picture_ready_.emplace(output_record.cleared, picture);
+  SendPictureReady();
+  // This picture will be cleared next time we see it.
+  output_record.cleared = true;
+}
+
 void V4L2VideoDecodeAccelerator::SendPictureReady() {
   DVLOGF(4);
   DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread());
@@ -2614,16 +2624,8 @@
   DCHECK_EQ(output_record.state, kAtProcessor);
   DCHECK_NE(output_record.picture_id, -1);
 
-  // Send the processed frame to render.
-  output_record.state = kAtClient;
-  decoder_frames_at_client_++;
   image_processor_bitstream_buffer_ids_.pop();
-  // TODO(hubbe): Insert correct color space. http://crbug.com/647725
-  const Picture picture(output_record.picture_id, bitstream_buffer_id,
-                        gfx::Rect(visible_size_), gfx::ColorSpace(), false);
-  pending_picture_ready_.push(PictureRecord(output_record.cleared, picture));
-  SendPictureReady();
-  output_record.cleared = true;
+  SendBufferToClient(output_buffer_index, bitstream_buffer_id);
   // Flush or resolution change may be waiting image processor to finish.
   if (image_processor_bitstream_buffer_ids_.empty()) {
     NotifyFlushDoneIfNeeded();
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_video_decode_accelerator.h
index 0500052..155c4c3 100644
--- a/media/gpu/v4l2/v4l2_video_decode_accelerator.h
+++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.h
@@ -394,6 +394,8 @@
   // output buffer is |output_buffer_index| and its id is |bitstream_buffer_id|.
   bool ProcessFrame(int32_t bitstream_buffer_id, int output_buffer_index);
 
+  void SendBufferToClient(size_t buffer_index, int32_t bitstream_buffer_id);
+
   //
   // Methods run on child thread.
   //
diff --git a/media/test/data/eme_player_js/utils.js b/media/test/data/eme_player_js/utils.js
index 256788d..b8f9b2b 100644
--- a/media/test/data/eme_player_js/utils.js
+++ b/media/test/data/eme_player_js/utils.js
@@ -316,3 +316,30 @@
         return promise;
       });
 };
+
+// Verify that |keyStatuses| contains just the keys in the array |expected|.
+// Each entry specifies the keyId and status expected.
+// Example call: verifyKeyStatuses(mediaKeySession.keyStatuses,
+//   [{keyId: key1, status: 'usable'}, {keyId: key2, status: 'released'}]);
+Utils.verifyKeyStatuses = function(keyStatuses, expected) {
+  // |keyStatuses| should have same size as number of |keys.expected|.
+  if (keyStatuses.size !== expected.length) {
+    Utils.failTest(
+        'keystatuses should have expected size of ' + expected.length +
+        ' but has size ' + keyStatuses.size);
+  }
+
+  // All |expected| should be found.
+  expected.map(function(item) {
+    if (!keyStatuses.has(Utils.convertToUint8Array(item.keyId))) {
+      Utils.failTest('missing keyID ' + item.keyId);
+    }
+    if (keyStatuses.get(Utils.convertToUint8Array(item.keyId)) !==
+        item.status) {
+      Utils.failTest(
+          'keyId ' + item.keyId + ' has status ' +
+          keyStatuses.get(Utils.convertToUint8Array(item.keyId)) +
+          ', expected ' + item.status);
+    }
+  });
+};
diff --git a/media/test/data/eme_remove_session_test.html b/media/test/data/eme_remove_session_test.html
new file mode 100644
index 0000000..b960255
--- /dev/null
+++ b/media/test/data/eme_remove_session_test.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<title>Test that remove() succeeds on temporary sessions</title>
+// This test is similar to the layout test
+// encrypted-media-session-remove-temporary.html, but needs to run as a
+// browser test as it needs access to a license server (for Widevine).
+
+<div id="logs"></div>
+<script src='eme_player_js/app_loader.js' type='text/javascript'></script>
+<script type='text/javascript'>
+  // This test only uses |keySystem| and |licenseServerURL|.
+  var testConfig = new TestConfig();
+  testConfig.loadQueryParams();
+
+  // Use the default KEY_ID and KEY as specified in eme_player_js/globals.js.
+  const keyId = KEY_ID;
+  const key = KEY;
+
+  // Code for using the Widevine key system.
+  function WidevineKeySystemHelper() {}
+
+  // Called when a 'message' event happens. Send the message to the license
+  // server, and when the response is received, call update() and then call
+  // |resolve| or |reject| as appropriate.
+  WidevineKeySystemHelper.prototype.onMessage = function(
+      event, resolve, reject) {
+    var mediaKeySession = event.target;
+    function onSuccess(response) {
+      var key = new Uint8Array(response);
+      Utils.timeLog('Update media key session with license response.', key);
+      mediaKeySession.update(key).then(resolve, reject);
+    }
+    Utils.sendRequest(
+        'POST', 'arraybuffer', Utils.convertToUint8Array(event.message),
+        this.testConfig.licenseServerURL, onSuccess);
+  };
+
+  // Code for using the ClearKey key system.
+  function ClearKeyKeySystemHelper() {}
+
+  // Called when a 'message' event happens. For ClearKey we know the key to be
+  // used, so simply call update() and then call |resolve| or |reject| as
+  // appropriate.
+  ClearKeyKeySystemHelper.prototype.onMessage = function(
+      event, resolve, reject) {
+    var mediaKeySession = event.target;
+    const jwkSet = Utils.createJWKData(keyId, key);
+    mediaKeySession.update(jwkSet).then(resolve, reject);
+  };
+
+  var keySystemHelper;
+  if (testConfig.keySystem == WIDEVINE_KEYSYSTEM) {
+    keySystemHelper = new WidevineKeySystemHelper();
+  } else if (
+      testConfig.keySystem == CLEARKEY ||
+      testConfig.keySystem == EXTERNAL_CLEARKEY) {
+    keySystemHelper = new ClearKeyKeySystemHelper();
+  } else {
+    Utils.timeLog('Unsupported key system ' + testConfig.keySystem);
+  }
+
+  // This test doesn't play any media, so no concern with specifying multiple
+  // codecs. This is done to provide a set of codecs that should cover all
+  // user agents.
+  const config = [{
+    initDataTypes: ['webm'],
+    audioCapabilities: [
+      {contentType: 'audio/mp4; codecs="mp4a.40.2"'},
+      {contentType: 'audio/webm; codecs="opus"'},
+    ],
+    persistentState: 'optional',
+    sessionTypes: ['temporary'],
+  }];
+  var waitForMessagePromise;
+
+  navigator.requestMediaKeySystemAccess(testConfig.keySystem, config)
+      .then(function(access) {
+        Utils.timeLog(
+            'Supports initDataType ' +
+            access.getConfiguration().initDataTypes[0]);
+        return access.createMediaKeys();
+      })
+      .then(function(mediaKeys) {
+        mediaKeySession = mediaKeys.createSession();
+        waitForMessagePromise = Utils.waitForEvent(
+            mediaKeySession, 'message', keySystemHelper.onMessage);
+
+        // As this is using 'webm' initDataType, the data to generateRequest()
+        // is simply the key ID.
+        Utils.timeLog('Calling generateRequest()');
+        return mediaKeySession.generateRequest(
+            'webm', Utils.convertToUint8Array(keyId));
+      })
+      .then(function() {
+        // keySystemHelper.onMessage() returns the result of calling update().
+        Utils.timeLog('Waiting for message event');
+        return waitForMessagePromise;
+      })
+      .then(function() {
+        // After update() the session should have 1 usable key.
+        Utils.timeLog('Checking keyStatuses');
+        Utils.verifyKeyStatuses(
+            mediaKeySession.keyStatuses, [{keyId: keyId, status: 'usable'}]);
+        Utils.timeLog('Calling remove()');
+        return mediaKeySession.remove();
+      })
+      .then(function() {
+        // After remove() all keys should be 'released'.
+        Utils.verifyKeyStatuses(
+            mediaKeySession.keyStatuses, [{keyId: keyId, status: 'released'}]);
+        // After remove() the session expiry should be NaN.
+        if (!isNaN(mediaKeySession.expiration)) {
+          Utils.failTest('expiration is not Nan');
+          return;
+        }
+        Utils.timeLog('Calling close()');
+        return mediaKeySession.close();
+      })
+      .then(function() {
+        // After close() there should be no keys.
+        Utils.verifyKeyStatuses(mediaKeySession.keyStatuses, []);
+        Utils.setResultInTitle('ENDED');
+      })
+      .catch(function(error) {
+        Utils.timeLog(error);
+        Utils.failTest('Failed test.');
+      });
+</script>
+</html>
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index 1d372f6..f0eb6249 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -1058,12 +1058,18 @@
 }
 
 QuicChromiumClientStream*
-QuicChromiumClientSession::CreateOutgoingDynamicStream() {
+QuicChromiumClientSession::CreateOutgoingBidirectionalStream() {
   NOTREACHED() << "CreateOutgoingReliableStreamImpl should be called directly";
   return nullptr;
 }
 
 QuicChromiumClientStream*
+QuicChromiumClientSession::CreateOutgoingUnidirectionalStream() {
+  NOTREACHED() << "Try to create outgoing unidirectional stream";
+  return nullptr;
+}
+
+QuicChromiumClientStream*
 QuicChromiumClientSession::CreateOutgoingReliableStreamImpl(
     const NetworkTrafficAnnotationTag& traffic_annotation) {
   DCHECK(connection()->connected());
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h
index 2a2da167..dfcc477 100644
--- a/net/quic/quic_chromium_client_session.h
+++ b/net/quic/quic_chromium_client_session.h
@@ -461,7 +461,8 @@
 
   // quic::QuicSession methods:
   void OnStreamFrame(const quic::QuicStreamFrame& frame) override;
-  QuicChromiumClientStream* CreateOutgoingDynamicStream() override;
+  QuicChromiumClientStream* CreateOutgoingBidirectionalStream() override;
+  QuicChromiumClientStream* CreateOutgoingUnidirectionalStream() override;
   const quic::QuicCryptoClientStream* GetCryptoStream() const override;
   quic::QuicCryptoClientStream* GetMutableCryptoStream() override;
   void CloseStream(quic::QuicStreamId stream_id) override;
diff --git a/net/quic/quic_chromium_client_stream_test.cc b/net/quic/quic_chromium_client_stream_test.cc
index 1652348..99924ba 100644
--- a/net/quic/quic_chromium_client_stream_test.cc
+++ b/net/quic/quic_chromium_client_stream_test.cc
@@ -62,7 +62,8 @@
                     quic::ConnectionCloseSource source));
   MOCK_METHOD1(CreateIncomingDynamicStream,
                quic::QuicSpdyStream*(quic::QuicStreamId id));
-  MOCK_METHOD0(CreateOutgoingDynamicStream, QuicChromiumClientStream*());
+  MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicChromiumClientStream*());
+  MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicChromiumClientStream*());
   MOCK_METHOD5(WritevData,
                quic::QuicConsumedData(quic::QuicStream* stream,
                                       quic::QuicStreamId id,
diff --git a/net/third_party/quic/core/http/quic_server_session_base_test.cc b/net/third_party/quic/core/http/quic_server_session_base_test.cc
index 2b77009d..01d134c 100644
--- a/net/third_party/quic/core/http/quic_server_session_base_test.cc
+++ b/net/third_party/quic/core/http/quic_server_session_base_test.cc
@@ -73,7 +73,12 @@
     return stream;
   }
 
-  QuicSpdyStream* CreateOutgoingDynamicStream() override {
+  QuicSpdyStream* CreateOutgoingBidirectionalStream() override {
+    DCHECK(false);
+    return nullptr;
+  }
+
+  QuicSpdyStream* CreateOutgoingUnidirectionalStream() override {
     if (!ShouldCreateOutgoingDynamicStream()) {
       return nullptr;
     }
diff --git a/net/third_party/quic/core/http/quic_spdy_client_session.cc b/net/third_party/quic/core/http/quic_spdy_client_session.cc
index 512438a..24ff19b6 100644
--- a/net/third_party/quic/core/http/quic_spdy_client_session.cc
+++ b/net/third_party/quic/core/http/quic_spdy_client_session.cc
@@ -68,7 +68,8 @@
   return CanOpenNextOutgoingStream();
 }
 
-QuicSpdyClientStream* QuicSpdyClientSession::CreateOutgoingDynamicStream() {
+QuicSpdyClientStream*
+QuicSpdyClientSession::CreateOutgoingBidirectionalStream() {
   if (!ShouldCreateOutgoingDynamicStream()) {
     return nullptr;
   }
@@ -78,6 +79,12 @@
   return stream_ptr;
 }
 
+QuicSpdyClientStream*
+QuicSpdyClientSession::CreateOutgoingUnidirectionalStream() {
+  QUIC_BUG << "Try to create outgoing unidirectional client data streams";
+  return nullptr;
+}
+
 std::unique_ptr<QuicSpdyClientStream>
 QuicSpdyClientSession::CreateClientStream() {
   return QuicMakeUnique<QuicSpdyClientStream>(GetNextOutgoingStreamId(), this,
diff --git a/net/third_party/quic/core/http/quic_spdy_client_session.h b/net/third_party/quic/core/http/quic_spdy_client_session.h
index 06fe99e..9e1bc11 100644
--- a/net/third_party/quic/core/http/quic_spdy_client_session.h
+++ b/net/third_party/quic/core/http/quic_spdy_client_session.h
@@ -37,7 +37,8 @@
   void Initialize() override;
 
   // QuicSession methods:
-  QuicSpdyClientStream* CreateOutgoingDynamicStream() override;
+  QuicSpdyClientStream* CreateOutgoingBidirectionalStream() override;
+  QuicSpdyClientStream* CreateOutgoingUnidirectionalStream() override;
   QuicCryptoClientStreamBase* GetMutableCryptoStream() override;
   const QuicCryptoClientStreamBase* GetCryptoStream() const override;
 
@@ -74,10 +75,11 @@
   // Create the crypto stream. Called by Initialize().
   virtual std::unique_ptr<QuicCryptoClientStreamBase> CreateQuicCryptoStream();
 
-  // Unlike CreateOutgoingDynamicStream, which applies a bunch of sanity checks,
-  // this simply returns a new QuicSpdyClientStream. This may be used by
-  // subclasses which want to use a subclass of QuicSpdyClientStream for streams
-  // but wish to use the sanity checks in CreateOutgoingDynamicStream.
+  // Unlike CreateOutgoingBidirectionalStream, which applies a bunch of
+  // sanity checks, this simply returns a new QuicSpdyClientStream. This may be
+  // used by subclasses which want to use a subclass of QuicSpdyClientStream for
+  // streams but wish to use the sanity checks in
+  // CreateOutgoingBidirectionalStream.
   virtual std::unique_ptr<QuicSpdyClientStream> CreateClientStream();
 
   const QuicServerId& server_id() { return server_id_; }
diff --git a/net/third_party/quic/core/http/quic_spdy_client_session_test.cc b/net/third_party/quic/core/http/quic_spdy_client_session_test.cc
index 8897294..a9058c2 100644
--- a/net/third_party/quic/core/http/quic_spdy_client_session_test.cc
+++ b/net/third_party/quic/core/http/quic_spdy_client_session_test.cc
@@ -160,7 +160,7 @@
   // established and will allow streams to be created.
   session_->CryptoConnect();
   EXPECT_TRUE(session_->IsEncryptionEstablished());
-  QuicSpdyClientStream* stream = session_->CreateOutgoingDynamicStream();
+  QuicSpdyClientStream* stream = session_->CreateOutgoingBidirectionalStream();
   ASSERT_TRUE(stream != nullptr);
   EXPECT_NE(kCryptoStreamId, stream->id());
 
@@ -177,7 +177,7 @@
             QuicPacketCreatorPeer::GetEncryptionLevel(
                 QuicConnectionPeer::GetPacketCreator(connection_)));
   // Verify that no new streams may be created.
-  EXPECT_TRUE(session_->CreateOutgoingDynamicStream() == nullptr);
+  EXPECT_TRUE(session_->CreateOutgoingBidirectionalStream() == nullptr);
   // Verify that no data may be send on existing streams.
   char data[] = "hello world";
   QuicConsumedData consumed = session_->WritevData(
@@ -199,16 +199,16 @@
   const uint32_t kServerMaxIncomingStreams = 1;
   CompleteCryptoHandshake(kServerMaxIncomingStreams);
 
-  QuicSpdyClientStream* stream = session_->CreateOutgoingDynamicStream();
+  QuicSpdyClientStream* stream = session_->CreateOutgoingBidirectionalStream();
   ASSERT_TRUE(stream);
-  EXPECT_FALSE(session_->CreateOutgoingDynamicStream());
+  EXPECT_FALSE(session_->CreateOutgoingBidirectionalStream());
 
   // Close the stream, but without having received a FIN or a RST_STREAM
   // and check that a new one can not be created.
   session_->CloseStream(stream->id());
   EXPECT_EQ(1u, session_->GetNumOpenOutgoingStreams());
 
-  stream = session_->CreateOutgoingDynamicStream();
+  stream = session_->CreateOutgoingBidirectionalStream();
   EXPECT_FALSE(stream);
 }
 
@@ -225,9 +225,9 @@
   const uint32_t kServerMaxIncomingStreams = 1;
   CompleteCryptoHandshake(kServerMaxIncomingStreams);
 
-  QuicSpdyClientStream* stream = session_->CreateOutgoingDynamicStream();
+  QuicSpdyClientStream* stream = session_->CreateOutgoingBidirectionalStream();
   ASSERT_NE(nullptr, stream);
-  EXPECT_EQ(nullptr, session_->CreateOutgoingDynamicStream());
+  EXPECT_EQ(nullptr, session_->CreateOutgoingBidirectionalStream());
 
   // Close the stream and receive an RST frame to remove the unfinished stream
   session_->CloseStream(stream->id());
@@ -235,7 +235,7 @@
                                            QUIC_RST_ACKNOWLEDGEMENT, 0));
   // Check that a new one can be created.
   EXPECT_EQ(0u, session_->GetNumOpenOutgoingStreams());
-  stream = session_->CreateOutgoingDynamicStream();
+  stream = session_->CreateOutgoingBidirectionalStream();
   EXPECT_NE(nullptr, stream);
 }
 
@@ -253,9 +253,9 @@
   const uint32_t kServerMaxIncomingStreams = 1;
   CompleteCryptoHandshake(kServerMaxIncomingStreams);
 
-  QuicSpdyClientStream* stream = session_->CreateOutgoingDynamicStream();
+  QuicSpdyClientStream* stream = session_->CreateOutgoingBidirectionalStream();
   ASSERT_NE(nullptr, stream);
-  EXPECT_FALSE(session_->CreateOutgoingDynamicStream());
+  EXPECT_FALSE(session_->CreateOutgoingBidirectionalStream());
 
   QuicStreamId stream_id = stream->id();
   EXPECT_CALL(*connection_, SendControlFrame(_)).Times(1);
@@ -265,7 +265,7 @@
   // A new stream cannot be created as the reset stream still counts as an open
   // outgoing stream until closed by the server.
   EXPECT_EQ(1u, session_->GetNumOpenOutgoingStreams());
-  stream = session_->CreateOutgoingDynamicStream();
+  stream = session_->CreateOutgoingBidirectionalStream();
   EXPECT_EQ(nullptr, stream);
 
   // The stream receives trailers with final byte offset: this is one of three
@@ -280,7 +280,7 @@
   // The stream is now complete from the client's perspective, and it should
   // be able to create a new outgoing stream.
   EXPECT_EQ(0u, session_->GetNumOpenOutgoingStreams());
-  stream = session_->CreateOutgoingDynamicStream();
+  stream = session_->CreateOutgoingBidirectionalStream();
   EXPECT_NE(nullptr, stream);
 }
 
@@ -289,7 +289,7 @@
   // received trailing headers with a malformed final byte offset value.
   CompleteCryptoHandshake();
 
-  QuicSpdyClientStream* stream = session_->CreateOutgoingDynamicStream();
+  QuicSpdyClientStream* stream = session_->CreateOutgoingBidirectionalStream();
   ASSERT_NE(nullptr, stream);
 
   // Send the RST, which results in the stream being closed locally (but some
@@ -348,7 +348,7 @@
   // streams.
   session_->connection()->OnGoAwayFrame(QuicGoAwayFrame(
       kInvalidControlFrameId, QUIC_PEER_GOING_AWAY, 1u, "Going away."));
-  EXPECT_EQ(nullptr, session_->CreateOutgoingDynamicStream());
+  EXPECT_EQ(nullptr, session_->CreateOutgoingBidirectionalStream());
 }
 
 static bool CheckForDecryptionError(QuicFramer* framer) {
@@ -428,7 +428,7 @@
   CompleteCryptoHandshake();
 
   MockQuicSpdyClientStream* stream = static_cast<MockQuicSpdyClientStream*>(
-      session_->CreateOutgoingDynamicStream());
+      session_->CreateOutgoingBidirectionalStream());
 
   EXPECT_CALL(*stream, OnPromiseHeaderList(_, _, _));
   session_->OnPromiseHeaderList(associated_stream_id_, promised_stream_id_, 0,
@@ -439,7 +439,7 @@
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
 
-  session_->CreateOutgoingDynamicStream();
+  session_->CreateOutgoingBidirectionalStream();
 
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_,
@@ -455,7 +455,7 @@
   CompleteCryptoHandshake();
 
   MockQuicSpdyClientStream* stream = static_cast<MockQuicSpdyClientStream*>(
-      session_->CreateOutgoingDynamicStream());
+      session_->CreateOutgoingBidirectionalStream());
 
   EXPECT_CALL(*stream, OnPromiseHeaderList(promised_stream_id_, _, _));
   session_->OnPromiseHeaderList(associated_stream_id_, promised_stream_id_, 0,
@@ -475,7 +475,7 @@
   CompleteCryptoHandshake();
 
   MockQuicSpdyClientStream* stream = static_cast<MockQuicSpdyClientStream*>(
-      session_->CreateOutgoingDynamicStream());
+      session_->CreateOutgoingBidirectionalStream());
 
   // Promise an illegal (outgoing) stream id.
   promised_stream_id_ = 1;
@@ -492,7 +492,7 @@
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
 
-  session_->CreateOutgoingDynamicStream();
+  session_->CreateOutgoingBidirectionalStream();
 
   EXPECT_TRUE(session_->HandlePromised(associated_stream_id_,
                                        promised_stream_id_, push_promise_));
@@ -505,7 +505,7 @@
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
 
-  session_->CreateOutgoingDynamicStream();
+  session_->CreateOutgoingBidirectionalStream();
   session_->GetOrCreateStream(promised_stream_id_);
 
   EXPECT_CALL(*connection_, SendControlFrame(_));
@@ -526,7 +526,7 @@
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
 
-  session_->CreateOutgoingDynamicStream();
+  session_->CreateOutgoingBidirectionalStream();
 
   EXPECT_TRUE(session_->HandlePromised(associated_stream_id_,
                                        promised_stream_id_, push_promise_));
@@ -616,7 +616,7 @@
 TEST_P(QuicSpdyClientSessionTest, OnInitialHeadersCompleteIsNotPush) {
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
-  session_->CreateOutgoingDynamicStream();
+  session_->CreateOutgoingBidirectionalStream();
   session_->OnInitialHeadersComplete(promised_stream_id_, SpdyHeaderBlock());
 }
 
@@ -658,7 +658,7 @@
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
 
-  session_->CreateOutgoingDynamicStream();
+  session_->CreateOutgoingBidirectionalStream();
 
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_,
@@ -676,7 +676,7 @@
   // Initialize crypto before the client session will create a stream.
   CompleteCryptoHandshake();
 
-  session_->CreateOutgoingDynamicStream();
+  session_->CreateOutgoingBidirectionalStream();
 
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_,
diff --git a/net/third_party/quic/core/http/quic_spdy_session.h b/net/third_party/quic/core/http/quic_spdy_session.h
index 9ecf6d0..937a765 100644
--- a/net/third_party/quic/core/http/quic_spdy_session.h
+++ b/net/third_party/quic/core/http/quic_spdy_session.h
@@ -135,11 +135,13 @@
   }
 
  protected:
-  // Override CreateIncomingDynamicStream() and CreateOutgoingDynamicStream()
-  // with QuicSpdyStream return type to make sure that all data streams are
-  // QuicSpdyStreams.
+  // Override CreateIncomingDynamicStream(),
+  // CreateOutgoingBidirectionalStream() and
+  // CreateOutgoingUnidirectionalStream() with QuicSpdyStream return type to
+  // make sure that all data streams are QuicSpdyStreams.
   QuicSpdyStream* CreateIncomingDynamicStream(QuicStreamId id) override = 0;
-  QuicSpdyStream* CreateOutgoingDynamicStream() override = 0;
+  QuicSpdyStream* CreateOutgoingBidirectionalStream() override = 0;
+  QuicSpdyStream* CreateOutgoingUnidirectionalStream() override = 0;
 
   QuicSpdyStream* GetSpdyDataStream(const QuicStreamId stream_id);
 
diff --git a/net/third_party/quic/core/http/quic_spdy_session_test.cc b/net/third_party/quic/core/http/quic_spdy_session_test.cc
index 3171326..c1f9400c 100644
--- a/net/third_party/quic/core/http/quic_spdy_session_test.cc
+++ b/net/third_party/quic/core/http/quic_spdy_session_test.cc
@@ -154,13 +154,20 @@
     return &crypto_stream_;
   }
 
-  TestStream* CreateOutgoingDynamicStream() override {
+  TestStream* CreateOutgoingBidirectionalStream() override {
     TestStream* stream =
         new TestStream(GetNextOutgoingStreamId(), this, BIDIRECTIONAL);
     ActivateStream(QuicWrapUnique(stream));
     return stream;
   }
 
+  TestStream* CreateOutgoingUnidirectionalStream() override {
+    TestStream* stream =
+        new TestStream(GetNextOutgoingStreamId(), this, WRITE_UNIDIRECTIONAL);
+    ActivateStream(QuicWrapUnique(stream));
+    return stream;
+  }
+
   TestStream* CreateIncomingDynamicStream(QuicStreamId id) override {
     // Enforce the limit on the number of open streams.
     if (GetNumOpenIncomingStreams() + 1 > max_open_incoming_streams()) {
@@ -376,9 +383,9 @@
 }
 
 TEST_P(QuicSpdySessionTestServer, IsClosedStreamLocallyCreated) {
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_EQ(GetNthServerInitiatedId(0), stream2->id());
-  QuicSpdyStream* stream4 = session_.CreateOutgoingDynamicStream();
+  QuicSpdyStream* stream4 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_EQ(GetNthServerInitiatedId(1), stream4->id());
 
   CheckClosedStreams();
@@ -445,7 +452,7 @@
     return;
   }
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicStreamId closed_stream_id = stream2->id();
   // Close the stream.
   EXPECT_CALL(*connection_, SendControlFrame(_));
@@ -459,9 +466,9 @@
 
 TEST_P(QuicSpdySessionTestServer, OnCanWrite) {
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -488,9 +495,9 @@
 
 TEST_P(QuicSpdySessionTestServer, TestBatchedWrites) {
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.set_writev_consumes_all_data(true);
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
@@ -565,9 +572,9 @@
   MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -605,9 +612,9 @@
   MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -658,7 +665,7 @@
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*writer, WritePacket(_, _, _, _, _)).Times(0);
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
 
@@ -674,11 +681,11 @@
   EXPECT_FALSE(session_.HasPendingHandshake());  // Default value.
 
   // Test that blocking other streams does not change our status.
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   EXPECT_FALSE(session_.HasPendingHandshake());
 
-  TestStream* stream3 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream3 = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream3->id());
   EXPECT_FALSE(session_.HasPendingHandshake());
 
@@ -686,7 +693,7 @@
   session_.MarkConnectionLevelWriteBlocked(kCryptoStreamId);
   EXPECT_TRUE(session_.HasPendingHandshake());
 
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream4->id());
   EXPECT_TRUE(session_.HasPendingHandshake());
 
@@ -718,9 +725,9 @@
 
 TEST_P(QuicSpdySessionTestServer, OnCanWriteWithClosedStream) {
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -760,7 +767,7 @@
 
   // Create a data stream, and although it is write blocked we never expect it
   // to be allowed to write as we are connection level flow control blocked.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream->id());
   EXPECT_CALL(*stream, OnCanWrite()).Times(0);
 
@@ -921,7 +928,7 @@
   session_.set_writev_consumes_all_data(true);
 
   // Create a stream, and send enough data to make it flow control blocked.
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicString body(kMinimumFlowControlSendWindow, '.');
   EXPECT_FALSE(stream2->flow_controller()->IsBlocked());
   EXPECT_FALSE(session_.IsConnectionFlowControlBlocked());
@@ -1057,7 +1064,7 @@
   // our connection level flow control receive window.
   // On close, the stream should mark as consumed all bytes between the highest
   // byte consumed so far and the final byte offset from the RST frame.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
 
   const QuicStreamOffset kByteOffset =
       1 + kInitialSessionFlowControlWindowForTest / 2;
@@ -1082,7 +1089,7 @@
   // The bytes between highest consumed byte, and the final byte offset that we
   // determined when the FIN arrived, should be marked as consumed at the
   // connection level flow controller when the stream is reset.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
 
   const QuicStreamOffset kByteOffset =
       kInitialSessionFlowControlWindowForTest / 2 - 1;
@@ -1121,7 +1128,7 @@
   session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed);
 
   // Reset our stream: this results in the stream being closed locally.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(stream->id(), _));
   stream->Reset(QUIC_STREAM_CANCELLED);
@@ -1159,7 +1166,7 @@
   session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed);
 
   // Reset our stream: this results in the stream being closed locally.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(stream->id(), _));
   stream->Reset(QUIC_STREAM_CANCELLED);
@@ -1223,7 +1230,7 @@
       .Times(2);
 
   // Check that stream frame + FIN results in connection close.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(stream->id(), _));
   stream->Reset(QUIC_STREAM_CANCELLED);
@@ -1363,7 +1370,7 @@
   // Verify that an incoming FIN is recorded in a stream object even if the read
   // side has been closed.  This prevents an entry from being made in
   // locally_closed_streams_highest_offset_ (which will never be deleted).
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   QuicStreamId stream_id = stream->id();
 
   // Close the read side manually.
@@ -1444,7 +1451,7 @@
 }
 
 TEST_P(QuicSpdySessionTestServer, ZombieStreams) {
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicStreamPeer::SetStreamBytesWritten(3, stream2);
   EXPECT_TRUE(stream2->IsWaitingForAcks());
 
@@ -1469,8 +1476,8 @@
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
 
   TestCryptoStream* crypto_stream = session_.GetMutableCryptoStream();
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
 
   QuicStreamFrame frame1(kCryptoStreamId, false, 0, 1300);
   QuicStreamFrame frame2(stream2->id(), false, 0, 9);
@@ -1527,9 +1534,9 @@
   QuicConnectionPeer::SetSessionDecidesWhatToWrite(connection_);
   InSequence s;
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   QuicStreamFrame frame1(stream2->id(), false, 0, 9);
   QuicStreamFrame frame2(stream4->id(), false, 0, 9);
@@ -1569,9 +1576,9 @@
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
   InSequence s;
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_))
       .WillOnce(Invoke(&session_, &TestSession::ClearControlFrame));
   session_.SendWindowUpdate(stream2->id(), 9);
diff --git a/net/third_party/quic/core/quic_dispatcher_test.cc b/net/third_party/quic/core/quic_dispatcher_test.cc
index 68c87ae7a..ee06318 100644
--- a/net/third_party/quic/core/quic_dispatcher_test.cc
+++ b/net/third_party/quic/core/quic_dispatcher_test.cc
@@ -76,7 +76,8 @@
                     const QuicString& error_details,
                     ConnectionCloseSource source));
   MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id));
-  MOCK_METHOD0(CreateOutgoingDynamicStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*());
 
   QuicCryptoServerStreamBase* CreateQuicCryptoServerStream(
       const QuicCryptoServerConfig* crypto_config,
diff --git a/net/third_party/quic/core/quic_session.h b/net/third_party/quic/core/quic_session.h
index 57002851..b4d757d 100644
--- a/net/third_party/quic/core/quic_session.h
+++ b/net/third_party/quic/core/quic_session.h
@@ -358,10 +358,15 @@
   // Returns nullptr and does error handling if the stream can not be created.
   virtual QuicStream* CreateIncomingDynamicStream(QuicStreamId id) = 0;
 
-  // Create a new stream to handle a locally-initiated stream.
+  // Create a new stream to handle a locally-initiated bidirectional stream.
   // Caller does not own the returned stream.
   // Returns nullptr if max streams have already been opened.
-  virtual QuicStream* CreateOutgoingDynamicStream() = 0;
+  virtual QuicStream* CreateOutgoingBidirectionalStream() = 0;
+
+  // Create a new stream to handle a locally-initiated write unidirectional
+  // stream. Caller does not own the returned stream. Returns nullptr if max
+  // streams have already been opened.
+  virtual QuicStream* CreateOutgoingUnidirectionalStream() = 0;
 
   // Return the reserved crypto stream.
   virtual QuicCryptoStream* GetMutableCryptoStream() = 0;
diff --git a/net/third_party/quic/core/quic_session_test.cc b/net/third_party/quic/core/quic_session_test.cc
index bd16d99..d3b255c 100644
--- a/net/third_party/quic/core/quic_session_test.cc
+++ b/net/third_party/quic/core/quic_session_test.cc
@@ -144,13 +144,20 @@
     return &crypto_stream_;
   }
 
-  TestStream* CreateOutgoingDynamicStream() override {
+  TestStream* CreateOutgoingBidirectionalStream() override {
     TestStream* stream =
         new TestStream(GetNextOutgoingStreamId(), this, BIDIRECTIONAL);
     ActivateStream(QuicWrapUnique(stream));
     return stream;
   }
 
+  TestStream* CreateOutgoingUnidirectionalStream() override {
+    TestStream* stream =
+        new TestStream(GetNextOutgoingStreamId(), this, WRITE_UNIDIRECTIONAL);
+    ActivateStream(QuicWrapUnique(stream));
+    return stream;
+  }
+
   TestStream* CreateIncomingDynamicStream(QuicStreamId id) override {
     // Enforce the limit on the number of open streams.
     if (GetNumOpenIncomingStreams() + 1 > max_open_incoming_streams()) {
@@ -326,9 +333,9 @@
 }
 
 TEST_P(QuicSessionTestServer, IsClosedStreamLocallyCreated) {
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_EQ(GetNthServerInitiatedId(0), stream2->id());
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_EQ(GetNthServerInitiatedId(1), stream4->id());
 
   CheckClosedStreams();
@@ -394,7 +401,7 @@
     return;
   }
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicStreamId closed_stream_id = stream2->id();
   // Close the stream.
   EXPECT_CALL(*connection_, SendControlFrame(_));
@@ -408,9 +415,9 @@
 
 TEST_P(QuicSessionTestServer, OnCanWrite) {
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -437,9 +444,9 @@
 
 TEST_P(QuicSessionTestServer, TestBatchedWrites) {
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.set_writev_consumes_all_data(true);
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
@@ -512,9 +519,9 @@
   MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -552,9 +559,9 @@
   MockSendAlgorithm* send_algorithm = new StrictMock<MockSendAlgorithm>;
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -605,7 +612,7 @@
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*writer, WritePacket(_, _, _, _, _)).Times(0);
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
 
@@ -621,11 +628,11 @@
   EXPECT_FALSE(session_.HasPendingHandshake());  // Default value.
 
   // Test that blocking other streams does not change our status.
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   EXPECT_FALSE(session_.HasPendingHandshake());
 
-  TestStream* stream3 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream3 = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream3->id());
   EXPECT_FALSE(session_.HasPendingHandshake());
 
@@ -633,7 +640,7 @@
   session_.MarkConnectionLevelWriteBlocked(kCryptoStreamId);
   EXPECT_TRUE(session_.HasPendingHandshake());
 
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream4->id());
   EXPECT_TRUE(session_.HasPendingHandshake());
 
@@ -665,9 +672,9 @@
 
 TEST_P(QuicSessionTestServer, OnCanWriteWithClosedStream) {
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   session_.MarkConnectionLevelWriteBlocked(stream2->id());
   session_.MarkConnectionLevelWriteBlocked(stream6->id());
@@ -706,7 +713,7 @@
 
   // Create a data stream, and although it is write blocked we never expect it
   // to be allowed to write as we are connection level flow control blocked.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   session_.MarkConnectionLevelWriteBlocked(stream->id());
   EXPECT_CALL(*stream, OnCanWrite()).Times(0);
 
@@ -845,7 +852,7 @@
   session_.set_writev_consumes_all_data(true);
 
   // Create a stream, and send enough data to make it flow control blocked.
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicString body(kMinimumFlowControlSendWindow, '.');
   EXPECT_FALSE(stream2->flow_controller()->IsBlocked());
   EXPECT_FALSE(session_.IsConnectionFlowControlBlocked());
@@ -915,7 +922,7 @@
   // our connection level flow control receive window.
   // On close, the stream should mark as consumed all bytes between the highest
   // byte consumed so far and the final byte offset from the RST frame.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
 
   const QuicStreamOffset kByteOffset =
       1 + kInitialSessionFlowControlWindowForTest / 2;
@@ -939,7 +946,7 @@
   // The bytes between highest consumed byte, and the final byte offset that we
   // determined when the FIN arrived, should be marked as consumed at the
   // connection level flow controller when the stream is reset.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
 
   const QuicStreamOffset kByteOffset =
       kInitialSessionFlowControlWindowForTest / 2 - 1;
@@ -978,7 +985,7 @@
   session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed);
 
   // Reset our stream: this results in the stream being closed locally.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(stream->id(), _));
   stream->Reset(QUIC_STREAM_CANCELLED);
@@ -1016,7 +1023,7 @@
   session_.flow_controller()->AddBytesConsumed(kInitialConnectionBytesConsumed);
 
   // Reset our stream: this results in the stream being closed locally.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(stream->id(), _));
   stream->Reset(QUIC_STREAM_CANCELLED);
@@ -1080,7 +1087,7 @@
       .Times(2);
 
   // Check that stream frame + FIN results in connection close.
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(stream->id(), _));
   stream->Reset(QUIC_STREAM_CANCELLED);
@@ -1194,7 +1201,7 @@
   // Verify that an incoming FIN is recorded in a stream object even if the read
   // side has been closed.  This prevents an entry from being made in
   // locally_closed_streams_highest_offset_ (which will never be deleted).
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   QuicStreamId stream_id = stream->id();
 
   // Close the read side manually.
@@ -1239,7 +1246,7 @@
 }
 
 TEST_P(QuicSessionTestServer, ZombieStreams) {
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicStreamPeer::SetStreamBytesWritten(3, stream2);
   EXPECT_TRUE(stream2->IsWaitingForAcks());
 
@@ -1259,7 +1266,7 @@
 TEST_P(QuicSessionTestServer, TestZombieStreams) {
   session_.set_writev_consumes_all_data(true);
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicString body(100, '.');
   stream2->WriteOrBufferData(body, false, nullptr);
   EXPECT_TRUE(stream2->IsWaitingForAcks());
@@ -1276,7 +1283,7 @@
   ASSERT_EQ(1u, session_.closed_streams()->size());
   EXPECT_EQ(stream2->id(), session_.closed_streams()->front()->id());
 
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_)).Times(1);
   EXPECT_CALL(*connection_,
               OnStreamReset(stream4->id(), QUIC_STREAM_CANCELLED));
@@ -1295,8 +1302,8 @@
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
 
   TestCryptoStream* crypto_stream = session_.GetMutableCryptoStream();
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
 
   QuicStreamFrame frame1(kCryptoStreamId, false, 0, 1300);
   QuicStreamFrame frame2(stream2->id(), false, 0, 9);
@@ -1353,9 +1360,9 @@
   QuicConnectionPeer::SetSessionDecidesWhatToWrite(connection_);
   InSequence s;
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
 
   QuicStreamFrame frame1(stream2->id(), false, 0, 9);
   QuicStreamFrame frame2(stream4->id(), false, 0, 9);
@@ -1395,9 +1402,9 @@
   QuicConnectionPeer::SetSendAlgorithm(session_.connection(), send_algorithm);
   InSequence s;
 
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream4 = session_.CreateOutgoingDynamicStream();
-  TestStream* stream6 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
+  TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_CALL(*connection_, SendControlFrame(_))
       .WillOnce(Invoke(&session_, &TestSession::ClearControlFrame));
   session_.SendWindowUpdate(stream2->id(), 9);
@@ -1427,7 +1434,7 @@
   // This test mimics the scenario when a dynamic stream retransmits lost data
   // and causes connection close.
   QuicConnectionPeer::SetSessionDecidesWhatToWrite(connection_);
-  TestStream* stream = session_.CreateOutgoingDynamicStream();
+  TestStream* stream = session_.CreateOutgoingBidirectionalStream();
   QuicStreamFrame frame(stream->id(), false, 0, 9);
 
   EXPECT_CALL(*stream, HasPendingRetransmission())
@@ -1491,7 +1498,7 @@
   QuicConnectionPeer::SetSessionDecidesWhatToWrite(connection_);
 
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   QuicString body(100, '.');
   stream2->CloseReadSide();
   stream2->WriteOrBufferData(body, true, nullptr);
@@ -1530,7 +1537,7 @@
       QuicSessionPeer::GetCleanUpClosedStreamsAlarm(&session_)->IsSet());
 
   session_.set_writev_consumes_all_data(true);
-  TestStream* stream2 = session_.CreateOutgoingDynamicStream();
+  TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
   EXPECT_FALSE(stream2->IsWaitingForAcks());
 
   EXPECT_CALL(*connection_, SendControlFrame(_));
diff --git a/net/third_party/quic/quartc/quartc_session.cc b/net/third_party/quic/quartc/quartc_session.cc
index 4a2a3f20..93de609 100644
--- a/net/third_party/quic/quartc/quartc_session.cc
+++ b/net/third_party/quic/quartc/quartc_session.cc
@@ -170,13 +170,18 @@
   return crypto_stream_.get();
 }
 
-QuartcStream* QuartcSession::CreateOutgoingDynamicStream() {
+QuartcStream* QuartcSession::CreateOutgoingBidirectionalStream() {
   // Use default priority for incoming QUIC streams.
   // TODO(zhihuang): Determine if this value is correct.
   return ActivateDataStream(CreateDataStream(GetNextOutgoingStreamId(),
                                              QuicStream::kDefaultPriority));
 }
 
+QuartcStream* QuartcSession::CreateOutgoingUnidirectionalStream() {
+  DCHECK(false);
+  return nullptr;
+}
+
 void QuartcSession::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
   QuicSession::OnCryptoHandshakeEvent(event);
   if (event == HANDSHAKE_CONFIRMED) {
diff --git a/net/third_party/quic/quartc/quartc_session.h b/net/third_party/quic/quartc/quartc_session.h
index 89a1ef9..d0dd8af 100644
--- a/net/third_party/quic/quartc/quartc_session.h
+++ b/net/third_party/quic/quartc/quartc_session.h
@@ -51,7 +51,9 @@
 
   const QuicCryptoStream* GetCryptoStream() const override;
 
-  QuartcStream* CreateOutgoingDynamicStream() override;
+  QuartcStream* CreateOutgoingBidirectionalStream() override;
+
+  QuartcStream* CreateOutgoingUnidirectionalStream() override;
 
   void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override;
 
diff --git a/net/third_party/quic/quartc/quartc_session_test.cc b/net/third_party/quic/quartc/quartc_session_test.cc
index cb4aa2bd..c7318e0 100644
--- a/net/third_party/quic/quartc/quartc_session_test.cc
+++ b/net/third_party/quic/quartc/quartc_session_test.cc
@@ -178,7 +178,8 @@
     ASSERT_TRUE(client_peer_->IsEncryptionEstablished());
 
     // Now we can establish encrypted outgoing stream.
-    QuartcStream* outgoing_stream = server_peer_->CreateOutgoingDynamicStream();
+    QuartcStream* outgoing_stream =
+        server_peer_->CreateOutgoingBidirectionalStream();
     QuicStreamId stream_id = outgoing_stream->id();
     ASSERT_NE(nullptr, outgoing_stream);
     EXPECT_TRUE(server_peer_->HasOpenDynamicStreams());
@@ -262,8 +263,8 @@
 // Test that data streams are not created before handshake.
 TEST_F(QuartcSessionTest, CannotCreateDataStreamBeforeHandshake) {
   CreateClientAndServerSessions();
-  EXPECT_EQ(nullptr, server_peer_->CreateOutgoingDynamicStream());
-  EXPECT_EQ(nullptr, client_peer_->CreateOutgoingDynamicStream());
+  EXPECT_EQ(nullptr, server_peer_->CreateOutgoingBidirectionalStream());
+  EXPECT_EQ(nullptr, client_peer_->CreateOutgoingBidirectionalStream());
 }
 
 TEST_F(QuartcSessionTest, CancelQuartcStream) {
@@ -272,7 +273,7 @@
   ASSERT_TRUE(client_peer_->IsCryptoHandshakeConfirmed());
   ASSERT_TRUE(server_peer_->IsCryptoHandshakeConfirmed());
 
-  QuartcStream* stream = client_peer_->CreateOutgoingDynamicStream();
+  QuartcStream* stream = client_peer_->CreateOutgoingBidirectionalStream();
   ASSERT_NE(nullptr, stream);
 
   uint32_t id = stream->id();
@@ -294,7 +295,7 @@
   ASSERT_TRUE(client_peer_->IsCryptoHandshakeConfirmed());
   ASSERT_TRUE(server_peer_->IsCryptoHandshakeConfirmed());
 
-  QuartcStream* stream = client_peer_->CreateOutgoingDynamicStream();
+  QuartcStream* stream = client_peer_->CreateOutgoingBidirectionalStream();
   stream->SetDelegate(client_stream_delegate_.get());
 
   char kClientMessage[] = "Hello";
@@ -327,7 +328,7 @@
   ASSERT_TRUE(client_peer_->IsCryptoHandshakeConfirmed());
   ASSERT_TRUE(server_peer_->IsCryptoHandshakeConfirmed());
 
-  QuartcStream* stream = client_peer_->CreateOutgoingDynamicStream();
+  QuartcStream* stream = client_peer_->CreateOutgoingBidirectionalStream();
   QuicStreamId stream_id = stream->id();
   stream->SetDelegate(client_stream_delegate_.get());
   stream->set_cancel_on_loss(false);
@@ -351,7 +352,7 @@
   ASSERT_TRUE(client_peer_->IsCryptoHandshakeConfirmed());
   ASSERT_TRUE(server_peer_->IsCryptoHandshakeConfirmed());
 
-  QuartcStream* stream = client_peer_->CreateOutgoingDynamicStream();
+  QuartcStream* stream = client_peer_->CreateOutgoingBidirectionalStream();
   QuicStreamId stream_id = stream->id();
   stream->SetDelegate(client_stream_delegate_.get());
   stream->set_cancel_on_loss(true);
@@ -365,7 +366,7 @@
   simulator_.RunFor(QuicTime::Delta::FromMilliseconds(1));
 
   // Send another packet to trigger loss detection.
-  QuartcStream* stream_1 = client_peer_->CreateOutgoingDynamicStream();
+  QuartcStream* stream_1 = client_peer_->CreateOutgoingBidirectionalStream();
   stream_1->SetDelegate(client_stream_delegate_.get());
 
   char kMessage1[] = "Second message";
diff --git a/net/third_party/quic/quartc/quartc_stream_test.cc b/net/third_party/quic/quartc/quartc_stream_test.cc
index 17f1040..cc8858a 100644
--- a/net/third_party/quic/quartc/quartc_stream_test.cc
+++ b/net/third_party/quic/quartc/quartc_stream_test.cc
@@ -62,7 +62,11 @@
     return nullptr;
   }
 
-  QuartcStream* CreateOutgoingDynamicStream() override { return nullptr; }
+  QuartcStream* CreateOutgoingBidirectionalStream() override { return nullptr; }
+
+  QuartcStream* CreateOutgoingUnidirectionalStream() override {
+    return nullptr;
+  }
 
   const QuicCryptoStream* GetCryptoStream() const override { return nullptr; }
   QuicCryptoStream* GetMutableCryptoStream() override { return nullptr; }
diff --git a/net/third_party/quic/test_tools/quic_test_utils.h b/net/third_party/quic/test_tools/quic_test_utils.h
index e17c6b61..78273700 100644
--- a/net/third_party/quic/test_tools/quic_test_utils.h
+++ b/net/third_party/quic/test_tools/quic_test_utils.h
@@ -558,7 +558,8 @@
                     const QuicString& error_details,
                     ConnectionCloseSource source));
   MOCK_METHOD1(CreateIncomingDynamicStream, QuicStream*(QuicStreamId id));
-  MOCK_METHOD0(CreateOutgoingDynamicStream, QuicStream*());
+  MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicStream*());
+  MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicStream*());
   MOCK_METHOD1(ShouldCreateIncomingDynamicStream2, bool(QuicStreamId id));
   MOCK_METHOD0(ShouldCreateOutgoingDynamicStream2, bool());
   MOCK_METHOD5(WritevData,
@@ -635,7 +636,8 @@
                     const QuicString& error_details,
                     ConnectionCloseSource source));
   MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id));
-  MOCK_METHOD0(CreateOutgoingDynamicStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*());
   MOCK_METHOD1(ShouldCreateIncomingDynamicStream, bool(QuicStreamId id));
   MOCK_METHOD0(ShouldCreateOutgoingDynamicStream, bool());
   MOCK_METHOD5(WritevData,
@@ -717,7 +719,8 @@
   ~TestQuicSpdyServerSession() override;
 
   MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id));
-  MOCK_METHOD0(CreateOutgoingDynamicStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*());
   QuicCryptoServerStreamBase* CreateQuicCryptoServerStream(
       const QuicCryptoServerConfig* crypto_config,
       QuicCompressedCertsCache* compressed_certs_cache) override;
@@ -779,7 +782,8 @@
 
   // TestQuicSpdyClientSession
   MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id));
-  MOCK_METHOD0(CreateOutgoingDynamicStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*());
+  MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*());
   MOCK_METHOD1(ShouldCreateIncomingDynamicStream, bool(QuicStreamId id));
   MOCK_METHOD0(ShouldCreateOutgoingDynamicStream, bool());
 
diff --git a/net/third_party/quic/tools/quic_simple_server_session.cc b/net/third_party/quic/tools/quic_simple_server_session.cc
index 7e7c12979..64d081f 100644
--- a/net/third_party/quic/tools/quic_simple_server_session.cc
+++ b/net/third_party/quic/tools/quic_simple_server_session.cc
@@ -98,7 +98,14 @@
   return stream;
 }
 
-QuicSimpleServerStream* QuicSimpleServerSession::CreateOutgoingDynamicStream() {
+QuicSimpleServerStream*
+QuicSimpleServerSession::CreateOutgoingBidirectionalStream() {
+  DCHECK(false);
+  return nullptr;
+}
+
+QuicSimpleServerStream*
+QuicSimpleServerSession::CreateOutgoingUnidirectionalStream() {
   if (!ShouldCreateOutgoingDynamicStream()) {
     return nullptr;
   }
@@ -192,7 +199,8 @@
     }
 
     QuicSimpleServerStream* promised_stream =
-        static_cast<QuicSimpleServerStream*>(CreateOutgoingDynamicStream());
+        static_cast<QuicSimpleServerStream*>(
+            CreateOutgoingUnidirectionalStream());
     DCHECK_NE(promised_stream, nullptr);
     DCHECK_EQ(promised_info.stream_id, promised_stream->id());
     QUIC_DLOG(INFO) << "created server push stream " << promised_stream->id();
diff --git a/net/third_party/quic/tools/quic_simple_server_session.h b/net/third_party/quic/tools/quic_simple_server_session.h
index 2551bc43..bc105b9 100644
--- a/net/third_party/quic/tools/quic_simple_server_session.h
+++ b/net/third_party/quic/tools/quic_simple_server_session.h
@@ -86,7 +86,8 @@
  protected:
   // QuicSession methods:
   QuicSpdyStream* CreateIncomingDynamicStream(QuicStreamId id) override;
-  QuicSimpleServerStream* CreateOutgoingDynamicStream() override;
+  QuicSimpleServerStream* CreateOutgoingBidirectionalStream() override;
+  QuicSimpleServerStream* CreateOutgoingUnidirectionalStream() override;
   // Closing an outgoing stream can reduce open outgoing stream count, try
   // to handle queued promised streams right now.
   void CloseStreamInner(QuicStreamId stream_id, bool locally_reset) override;
diff --git a/net/third_party/quic/tools/quic_simple_server_session_test.cc b/net/third_party/quic/tools/quic_simple_server_session_test.cc
index 0bb347d..4f555619 100644
--- a/net/third_party/quic/tools/quic_simple_server_session_test.cc
+++ b/net/third_party/quic/tools/quic_simple_server_session_test.cc
@@ -63,9 +63,9 @@
     return s->CreateIncomingDynamicStream(id);
   }
 
-  static QuicSimpleServerStream* CreateOutgoingDynamicStream(
+  static QuicSimpleServerStream* CreateOutgoingUnidirectionalStream(
       QuicSimpleServerSession* s) {
-    return s->CreateOutgoingDynamicStream();
+    return s->CreateOutgoingUnidirectionalStream();
   }
 };
 
@@ -369,7 +369,8 @@
   size_t initial_num_open_stream = session_->GetNumOpenOutgoingStreams();
   QuicConnectionPeer::TearDownLocalConnectionState(connection_);
   EXPECT_QUIC_BUG(
-      QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(session_.get()),
+      QuicSimpleServerSessionPeer::CreateOutgoingUnidirectionalStream(
+          session_.get()),
       "ShouldCreateOutgoingDynamicStream called when disconnected");
 
   EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenOutgoingStreams());
@@ -385,7 +386,8 @@
   // established.
   size_t initial_num_open_stream = session_->GetNumOpenOutgoingStreams();
   EXPECT_QUIC_BUG(
-      QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(session_.get()),
+      QuicSimpleServerSessionPeer::CreateOutgoingUnidirectionalStream(
+          session_.get()),
       "Encryption not established so no outgoing stream created.");
   EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenOutgoingStreams());
 }
@@ -417,15 +419,16 @@
   // Create push streams till reaching the upper limit of allowed open streams.
   for (size_t i = 0; i < kMaxStreamsForTest; ++i) {
     QuicSpdyStream* created_stream =
-        QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
+        QuicSimpleServerSessionPeer::CreateOutgoingUnidirectionalStream(
             session_.get());
     EXPECT_EQ(GetNthServerInitiatedId(i), created_stream->id());
     EXPECT_EQ(i + 1, session_->GetNumOpenOutgoingStreams());
   }
 
   // Continuing creating push stream would fail.
-  EXPECT_EQ(nullptr, QuicSimpleServerSessionPeer::CreateOutgoingDynamicStream(
-                         session_.get()));
+  EXPECT_EQ(nullptr,
+            QuicSimpleServerSessionPeer::CreateOutgoingUnidirectionalStream(
+                session_.get()));
   EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams());
 
   // Create peer initiated stream should have no problem.
diff --git a/net/third_party/quic/tools/quic_spdy_client_base.cc b/net/third_party/quic/tools/quic_spdy_client_base.cc
index b88fd79..01ff7cb 100644
--- a/net/third_party/quic/tools/quic_spdy_client_base.cc
+++ b/net/third_party/quic/tools/quic_spdy_client_base.cc
@@ -152,7 +152,7 @@
   }
 
   auto* stream = static_cast<QuicSpdyClientStream*>(
-      client_session()->CreateOutgoingDynamicStream());
+      client_session()->CreateOutgoingBidirectionalStream());
   if (stream) {
     stream->SetPriority(QuicStream::kDefaultPriority);
     stream->set_visitor(this);
diff --git a/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter b/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter
index c9174a7..7bd74ca 100644
--- a/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter
+++ b/testing/buildbot/filters/chromeos.mash.fyi.browser_tests.filter
@@ -44,11 +44,6 @@
 # Uses Shell/SplitViewController.
 -NonHomeLauncherBrowserNonClientFrameViewAshTest.HeaderHeightForSnappedBrowserInSplitView/*
 
-# Fix immersive fullscreen mode in mash. https://crbug.com/844748.
-# Needs EventGenerator to work across window tree hosts. crbug.com/814675
--ImmersiveModeBrowserViewTest.TestCaptionButtonsReceiveEventsInAppImmersiveMode*
--ImmersiveModeBrowserViewTest.TestCaptionButtonsReceiveEventsInBrowserImmersiveMode*
-
 # ash::Shell access from ChromeViewsDelegate::CreateDefaultNonClientFrameView()
 # e.g. from chromeos::CaptivePortalWindowProxy::Show().
 # See https://crbug.com/838974
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter b/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter
index 4fffedf..e13f0f1 100644
--- a/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter
+++ b/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter
@@ -38,11 +38,6 @@
 # Crash in ash::SplitViewController
 -NonHomeLauncherBrowserNonClientFrameViewAshTest.HeaderHeightForSnappedBrowserInSplitView/*
 
-# Fix immersive fullscreen mode in mash. https://crbug.com/844748.
-# Needs EventGenerator to work across window tree hosts. crbug.com/814675
--ImmersiveModeBrowserViewTest.TestCaptionButtonsReceiveEventsInAppImmersiveMode*
--ImmersiveModeBrowserViewTest.TestCaptionButtonsReceiveEventsInBrowserImmersiveMode*
-
 # Need pixel copy support. http://crbug.com/754864 http://crbug.com/754872
 -CastMirroringServiceHostBrowserTest.CaptureTabVideo
 -CastStreamingApiTestWithPixelOutput.*
diff --git a/testing/buildbot/filters/webui_polymer2_browser_tests.filter b/testing/buildbot/filters/webui_polymer2_browser_tests.filter
index f5039f7..38f91b67 100644
--- a/testing/buildbot/filters/webui_polymer2_browser_tests.filter
+++ b/testing/buildbot/filters/webui_polymer2_browser_tests.filter
@@ -17,9 +17,6 @@
 # Chrome Desktop failures (Mac, Linux, Windows).
 -MediaRouterElementsBrowserTest.MediaRouterContainerCastModeList
 -MediaRouterElementsBrowserTest.MediaRouterContainerFilterPart1
--MediaRouterElementsBrowserTest.MediaRouterContainerFirstRunFlow
--MediaRouterElementsBrowserTest.MediaRouterContainerSinkList
--MediaRouterElementsBrowserTest.MediaRouterRouteDetails
 
 # ChromeOS only test failures.
 -ActiveDirectoryJoinTest.TestActiveDirectoryEnrollment_DistinguishedName
@@ -238,7 +235,10 @@
 MaterialHistoryToolbarTest.*
 MediaEngagementWebUIBrowserTest.*
 MediaRouterElementsBrowserTest.IssueBanner
+MediaRouterElementsBrowserTest.MediaRouterContainerFirstRunFlow
+MediaRouterElementsBrowserTest.MediaRouterContainerSinkList
 MediaRouterElementsBrowserTest.MediaRouterHeader
+MediaRouterElementsBrowserTest.MediaRouterRouteDetails
 Mock4JSWebUITest.*
 Mock4JSWebUITest.*
 Mock4JSWebUITestFails.*
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index f57de76..d96a0413 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -5325,6 +5325,8 @@
 
 # Sheriff 2018-10-08
 crbug.com/893015 virtual/outofblink-cors/http/tests/fetch/chromium/release-handle-crash.html [ Failure Pass ]
+crbug.com/893015 http/tests/fetch/chromium/release-handle-crash.html [ Crash Pass ]
+crbug.com/893015 virtual/outofblink-cors-ns/http/tests/fetch/chromium/release-handle-crash.html [ Crash Pass ]
 
 # Sheriff 2018-10-09
 crbug.com/893508 [ Linux ] http/tests/devtools/sources/debugger/live-edit-no-reveal.js [ Failure Pass ]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-postmessage-sharedarraybuffer.https.html b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-postmessage-sharedarraybuffer.https.html
new file mode 100644
index 0000000..8194d197
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-postmessage-sharedarraybuffer.https.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>
+      Test passing SharedArrayBuffer to an AudioWorklet
+    </title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/webaudio/resources/audit.js"></script>
+  </head>
+  <body>
+    <script id="layout-test-code">
+      let audit = Audit.createTaskRunner();
+
+      let context = new AudioContext();
+
+      let filePath = 'processors/sharedarraybuffer-processor.js';
+
+      if (window.SharedArrayBuffer) {
+        audit.define(
+            'Test postMessage from AudioWorkletProcessor to AudioWorkletNode',
+            (task, should) => {
+              let workletNode =
+                  new AudioWorkletNode(context, 'sharedarraybuffer-processor');
+
+              // After it is created, the worklet will send a new
+              // SharedArrayBuffer to the main thread.
+              //
+              // The worklet will then wait to receive a message from the main
+              // thread.
+              //
+              // When it receives the message, it will check whether it is a
+              // SharedArrayBuffer, and send this information back to the main
+              // thread.
+
+              workletNode.port.onmessage = (event) => {
+                let data = event.data;
+                switch (data.state) {
+                  case 'created':
+                    should(
+                        data.sab instanceof SharedArrayBuffer,
+                        'event.data.sab from worklet is an instance of SharedArrayBuffer')
+                        .beTrue();
+
+                    // Send a SharedArrayBuffer back to the worklet.
+                    let sab = new SharedArrayBuffer(8);
+                    workletNode.port.postMessage(sab);
+                    break;
+
+                  case 'received message':
+                    should(data.isSab, 'event.data from main thread is an instance of SharedArrayBuffer')
+                        .beTrue();
+                    task.done();
+                    break;
+
+                  default:
+                    should(false,
+                           `Got unexpected message from worklet: ${data.state}`)
+                        .beTrue();
+                    task.done();
+                    break;
+                }
+              };
+
+              workletNode.port.onmessageerror = (event) => {
+                should(false, 'Got messageerror from worklet').beTrue();
+                task.done();
+              };
+            });
+      } else {
+        // NOTE(binji): SharedArrayBuffer is only enabled where we have site
+        // isolation.
+        audit.define('Skipping test because SharedArrayBuffer is not defined',
+          (task, should) => {
+            task.done();
+          });
+      }
+
+      context.audioWorklet.addModule(filePath).then(() => {
+        audit.run();
+      });
+    </script>
+  </body>
+</html>
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/processors/sharedarraybuffer-processor.js b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/processors/sharedarraybuffer-processor.js
new file mode 100644
index 0000000..2ccacccd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/processors/sharedarraybuffer-processor.js
@@ -0,0 +1,35 @@
+/**
+ * @class SharedArrayBufferProcessor
+ * @extends AudioWorkletProcessor
+ *
+ * This processor class demonstrates passing SharedArrayBuffers to and from
+ * workers.
+ */
+class SharedArrayBufferProcessor extends AudioWorkletProcessor {
+  constructor() {
+    super();
+    this.port.onmessage = this.handleMessage.bind(this);
+    this.port.onmessageerror = this.handleMessageError.bind(this);
+    let sab = new SharedArrayBuffer(8);
+    this.port.postMessage({state: 'created', sab});
+  }
+
+  handleMessage(event) {
+    this.port.postMessage({
+      state: 'received message',
+      isSab: event.data instanceof SharedArrayBuffer
+    });
+  }
+
+  handleMessageError(event) {
+    this.port.postMessage({
+      state: 'received messageerror'
+    });
+  }
+
+  process() {
+    return true;
+  }
+}
+
+registerProcessor('sharedarraybuffer-processor', SharedArrayBufferProcessor);
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-limited-run-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-limited-run-expected.txt
index b9b42c8..23507051 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-limited-run-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-limited-run-expected.txt
@@ -16,6 +16,7 @@
 dom-size
 efficient-animated-content
 estimated-input-latency
+final-screenshot
 first-contentful-paint
 first-cpu-idle
 first-meaningful-paint
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-successful-run-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-successful-run-expected.txt
index ab81cff..925aa8ce 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-successful-run-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/audits2/audits2-successful-run-expected.txt
@@ -67,13 +67,14 @@
 Evaluating: Page load is fast enough on 3G
 Evaluating: Speed Index
 Evaluating: Screenshot Thumbnails
+Evaluating: Final Screenshot
 Evaluating: Estimated Input Latency
 Evaluating: No browser errors logged to the console
-Evaluating: Keep server response times low (TTFB)
+Evaluating: Server response times are low (TTFB)
 Evaluating: First CPU Idle
 Evaluating: Time to Interactive
 Evaluating: User Timing marks and measures
-Evaluating: Critical Request Chains
+Evaluating: Minimize Critical Requests Depth
 Evaluating: Avoid multiple page redirects
 Evaluating: User can be prompted to Install the Web App
 Evaluating: Configured for a custom splash screen
@@ -82,10 +83,10 @@
 Evaluating: Content is sized correctly for the viewport
 Evaluating: Displays images with correct aspect ratio
 Evaluating: Avoids deprecated APIs
-Evaluating: Minimizes main thread work
-Evaluating: JavaScript boot-up time
+Evaluating: Minimizes main-thread work
+Evaluating: JavaScript execution time
 Evaluating: Preload key requests
-Evaluating: Avoid multiple, costly round trips to any origin
+Evaluating: Preconnect to required origins
 Evaluating: All text remains visible during webfont loads
 Evaluating: Network Requests
 Evaluating: Metrics
@@ -132,6 +133,7 @@
 Evaluating: User focus is not accidentally trapped in a region
 Evaluating: Interactive controls are keyboard focusable
 Evaluating: Headings don't skip levels
+Evaluating: Interactive elements indicate their purpose and state
 Evaluating: The page has a logical tab order
 Evaluating: The user's focus is directed to new content added to the page
 Evaluating: Offscreen content is hidden from assistive technology
@@ -156,6 +158,7 @@
 Evaluating: Avoids requesting the geolocation permission on page load
 Evaluating: Avoids `document.write()`
 Evaluating: Avoids front-end JavaScript libraries with known security vulnerabilities
+Evaluating: Detected JavaScript libraries
 Evaluating: Avoids WebSQL DB
 Evaluating: Avoids requesting the notification permission on page load
 Evaluating: Allows users to paste into password fields
@@ -176,7 +179,7 @@
 
 =============== Lighthouse Results ===============
 URL: http://127.0.0.1:8000/devtools/resources/inspected-page.html
-Version: 3.0.3
+Version: 3.2.0
 
 
 accesskeys: not-applicable
@@ -209,6 +212,7 @@
 errors-in-console: pass
 estimated-input-latency: flaky
 external-anchors-use-rel-noopener: pass
+final-screenshot: ERROR Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse. (NO_SCREENSHOTS)
 first-contentful-paint: flaky
 first-cpu-idle: flaky
 first-meaningful-paint: flaky
@@ -227,8 +231,10 @@
 image-aspect-ratio: pass
 input-image-alt: not-applicable
 interactive: flaky
+interactive-element-affordance: manual
 is-crawlable: pass
 is-on-https: pass
+js-libraries: pass
 label: not-applicable
 layout-table: not-applicable
 link-name: not-applicable
@@ -237,7 +243,7 @@
 listitem: not-applicable
 load-fast-enough-for-pwa: flaky
 logical-tab-order: manual
-mainthread-work-breakdown: numeric
+mainthread-work-breakdown: ERROR Something went wrong with recording the trace over your page load. Please run Lighthouse again. (NO_FCP)
 managed-focus: manual
 manifest-short-name-length: not-applicable
 meta-description: fail
@@ -296,5 +302,5 @@
 without-javascript: fail
 works-offline: fail
 
-# of .lh-audit divs: 110
+# of .lh-audit divs: 112
 
diff --git a/third_party/blink/public/platform/modules/indexeddb/web_idb_database.h b/third_party/blink/public/platform/modules/indexeddb/web_idb_database.h
index 0db2c387..782d60fa 100644
--- a/third_party/blink/public/platform/modules/indexeddb/web_idb_database.h
+++ b/third_party/blink/public/platform/modules/indexeddb/web_idb_database.h
@@ -38,7 +38,6 @@
 
 class WebData;
 class WebIDBCallbacks;
-class WebIDBKey;
 class WebIDBKeyPath;
 class WebIDBKeyRange;
 
@@ -82,8 +81,6 @@
 
   static const long long kMinimumIndexId = 30;
 
-  typedef WebVector<WebIDBKey> WebIndexKeys;
-
   virtual void AddObserver(
       long long transaction_id,
       int32_t observer_id,
@@ -113,13 +110,11 @@
                    WebIDBKeyView primary_key,
                    WebIDBPutMode,
                    WebIDBCallbacks*,
-                   const WebVector<long long>& index_ids,
-                   WebVector<WebIndexKeys>) = 0;
+                   const WebVector<WebIDBIndexKeys>&) = 0;
   virtual void SetIndexKeys(long long transaction_id,
                             long long object_store_id,
                             WebIDBKeyView primary_key,
-                            const WebVector<long long>& index_ids,
-                            const WebVector<WebIndexKeys>&) = 0;
+                            const WebVector<WebIDBIndexKeys>&) = 0;
   virtual void SetIndexesReady(long long transaction_id,
                                long long object_store_id,
                                const WebVector<long long>& index_ids) = 0;
diff --git a/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h b/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h
index dafbc10..cdacdfe 100644
--- a/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h
+++ b/third_party/blink/public/platform/modules/indexeddb/web_idb_key.h
@@ -156,6 +156,8 @@
   std::unique_ptr<IDBKey> private_;
 };
 
+using WebIDBIndexKeys = std::pair<int64_t, WebVector<WebIDBKey>>;
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_INDEXEDDB_WEB_IDB_KEY_H_
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index cf54bb45..2f57bdd1 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -134,9 +134,6 @@
 class WebURLResponse;
 struct WebSize;
 
-using WebThread = Thread;
-using WebThreadCreationParams = ThreadCreationParams;
-
 namespace scheduler {
 class WebThreadScheduler;
 }
@@ -160,11 +157,10 @@
 
   // This is another entry point for embedders that only require simple
   // execution environment of Blink. This version automatically sets up Blink
-  // with a minimally viable implementation of WebThread for the main thread.
-  // The WebThread object is returned by Platform::CurrentThread(), therefore
-  // embedders do not need to override CurrentThread(), if your application
-  // is single-threaded. If your application supports multi-thread, you
-  // need to override CurrentThread() as well as CreateThread().
+  // with a minimally viable implementation of WebThreadScheduler and
+  // blink::Thread for the main thread.
+  //
+  // TODO(yutak): Fix function name as it seems obsolete at this point.
   static void CreateMainThreadAndInitialize(Platform*);
 
   // Used to switch the current platform only for testing.
@@ -432,35 +428,35 @@
 
   // Threads -------------------------------------------------------
 
-  // Thread creation is no longer customizable in Platform. CreateThread()
-  // always creates a new physical thread for Blink. Platform maintains
-  // the thread-local storage containing each WebThread object, so that
-  // CurrentThread() could return the correct thread object.
+  // blink::Thread creation is no longer customizable in Platform.
+  // CreateThread() always creates a new physical thread for Blink.
+  // Platform maintains the thread-local storage containing each blink::Thread
+  // object, so that CurrentThread() could return the correct thread object.
   //
   // TODO(yutak): These non-virtual functions should be moved to somewhere
   // else, because they no longer require embedder's implementation.
 
   // Creates a new thread. This may be called from a non-main thread (e.g.
   // nested Web workers).
-  std::unique_ptr<WebThread> CreateThread(const WebThreadCreationParams&);
+  std::unique_ptr<Thread> CreateThread(const ThreadCreationParams&);
 
   // Creates a WebAudio-specific thread with the elevated priority. Do NOT use
   // for any other purpose.
-  std::unique_ptr<WebThread> CreateWebAudioThread();
+  std::unique_ptr<Thread> CreateWebAudioThread();
 
   // Create and initialize the compositor thread. The thread is saved in
   // Platform, and will be accessible through CompositorThread().
   void InitializeCompositorThread();
 
   // Returns an interface to the current thread.
-  WebThread* CurrentThread();
+  Thread* CurrentThread();
 
   // Returns an interface to the main thread.
-  WebThread* MainThread();
+  Thread* MainThread();
 
   // Returns an interface to the compositor thread. This can be null if the
   // renderer was created with threaded rendering disabled.
-  WebThread* CompositorThread();
+  Thread* CompositorThread();
 
   // Returns the task runner of the compositor thread. This is available
   // once InitializeCompositorThread() is called.
@@ -771,13 +767,13 @@
   virtual bool IsTakingV8ContextSnapshot() { return false; }
 
  protected:
-  WebThread* main_thread_;
+  Thread* main_thread_;
 
  private:
   static void InitializeCommon(Platform* platform);
 
-  void WaitUntilWebThreadTLSUpdate(WebThread*);
-  void UpdateWebThreadTLS(WebThread* thread, base::WaitableEvent* event);
+  void WaitUntilThreadTLSUpdate(Thread*);
+  void UpdateThreadTLS(Thread* thread, base::WaitableEvent* event);
 
   // Platform owns the main thread in most cases. The pointer value is the same
   // as main_thread_ if this variable is non-null.
@@ -785,9 +781,9 @@
   // This variable is null if (and only if) ScopedTestingPlatformSupport<>
   // overrides the old Platform. In this case, main_thread_ points to the old
   // Platform's main thread. See testing_platform_support.h for this.
-  std::unique_ptr<WebThread> owned_main_thread_;
+  std::unique_ptr<Thread> owned_main_thread_;
 
-  std::unique_ptr<WebThread> compositor_thread_;
+  std::unique_ptr<Thread> compositor_thread_;
 
   // We can't use WTF stuff here. Ultimately these should go away (see comments
   // near CreateThread()), though.
diff --git a/third_party/blink/public/platform/scheduler/child/webthread_base.h b/third_party/blink/public/platform/scheduler/child/webthread_base.h
index 667d407..707ae11 100644
--- a/third_party/blink/public/platform/scheduler/child/webthread_base.h
+++ b/third_party/blink/public/platform/scheduler/child/webthread_base.h
@@ -25,18 +25,18 @@
 namespace scheduler {
 
 // TODO(scheduler-dev): Do not expose this class in Blink public API.
-class BLINK_PLATFORM_EXPORT WebThreadBase : public WebThread {
+class BLINK_PLATFORM_EXPORT WebThreadBase : public Thread {
  public:
   ~WebThreadBase() override;
 
   // CreateWorkerThread() may be called from a non-main thread.
   static std::unique_ptr<WebThreadBase> CreateWorkerThread(
-      const WebThreadCreationParams& params);
+      const ThreadCreationParams& params);
 
   static std::unique_ptr<WebThreadBase> CreateCompositorThread(
-      const WebThreadCreationParams& params);
+      const ThreadCreationParams& params);
 
-  // WebThread implementation.
+  // Thread implementation.
   bool IsCurrentThread() const override;
   PlatformThreadId ThreadId() const override = 0;
 
@@ -65,7 +65,7 @@
   virtual void RemoveTaskTimeObserverInternal(
       base::sequence_manager::TaskTimeObserver*) {}
 
-  static void RunWebThreadIdleTask(WebThread::IdleTask idle_task,
+  static void RunWebThreadIdleTask(Thread::IdleTask idle_task,
                                    base::TimeTicks deadline);
 
  private:
diff --git a/third_party/blink/public/platform/scheduler/test/fake_renderer_scheduler.h b/third_party/blink/public/platform/scheduler/test/fake_renderer_scheduler.h
index 7e4b0ae6c..23ff445 100644
--- a/third_party/blink/public/platform/scheduler/test/fake_renderer_scheduler.h
+++ b/third_party/blink/public/platform/scheduler/test/fake_renderer_scheduler.h
@@ -20,7 +20,7 @@
   ~FakeRendererScheduler() override;
 
   // RendererScheduler implementation.
-  std::unique_ptr<WebThread> CreateMainThread() override;
+  std::unique_ptr<Thread> CreateMainThread() override;
   scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override;
   scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner() override;
   scoped_refptr<base::SingleThreadTaskRunner> InputTaskRunner() override;
diff --git a/third_party/blink/public/platform/scheduler/test/mock_renderer_scheduler.h b/third_party/blink/public/platform/scheduler/test/mock_renderer_scheduler.h
index b93cadb..b90d717 100644
--- a/third_party/blink/public/platform/scheduler/test/mock_renderer_scheduler.h
+++ b/third_party/blink/public/platform/scheduler/test/mock_renderer_scheduler.h
@@ -22,7 +22,7 @@
   MockRendererScheduler() = default;
   ~MockRendererScheduler() override = default;
 
-  MOCK_METHOD0(CreateMainThread, std::unique_ptr<blink::WebThread>());
+  MOCK_METHOD0(CreateMainThread, std::unique_ptr<Thread>());
   MOCK_METHOD0(DefaultTaskRunner,
                scoped_refptr<base::SingleThreadTaskRunner>());
   MOCK_METHOD0(CompositorTaskRunner,
diff --git a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
index f989a16..53ae300 100644
--- a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
+++ b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
@@ -28,8 +28,6 @@
 namespace blink {
 class Thread;
 class WebInputEvent;
-
-using WebThread = Thread;
 }  // namespace blink
 
 namespace viz {
@@ -90,7 +88,7 @@
   virtual scoped_refptr<base::SingleThreadTaskRunner> CleanupTaskRunner();
 
   // Creates a WebThread implementation for the renderer main thread.
-  virtual std::unique_ptr<WebThread> CreateMainThread();
+  virtual std::unique_ptr<Thread> CreateMainThread();
 
   // Returns a new WebRenderWidgetSchedulingState.  The signals from this will
   // be used to make scheduling decisions.
diff --git a/third_party/blink/public/platform/web_url_request.h b/third_party/blink/public/platform/web_url_request.h
index 50ded709..b0b5aa1 100644
--- a/third_party/blink/public/platform/web_url_request.h
+++ b/third_party/blink/public/platform/web_url_request.h
@@ -105,7 +105,9 @@
     kOfflinePageOn = 1 << 8,
     kLitePageRedirectOn = 1 << 9,  // Allow the browser to redirect the resource
                                    // to a Lite Page server.
-    kPreviewsStateLast = kLitePageRedirectOn
+    kLazyImageLoadDeferred = 1 << 10,  // Request the placeholder version of an
+                                       // image that was deferred by lazyload.
+    kPreviewsStateLast = kLazyImageLoadDeferred
   };
 
   class ExtraData {
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni
index 92ba4896..d94d982 100644
--- a/third_party/blink/renderer/bindings/bindings.gni
+++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -106,8 +106,6 @@
                     "core/v8/use_counter_callback.h",
                     "core/v8/v0_custom_element_constructor_builder.cc",
                     "core/v8/v0_custom_element_constructor_builder.h",
-                    "core/v8/v8_abstract_event_handler.cc",
-                    "core/v8/v8_abstract_event_handler.h",
                     "core/v8/v8_binding_for_core.cc",
                     "core/v8/v8_binding_for_core.h",
                     "core/v8/v8_cache_options.h",
@@ -117,10 +115,6 @@
                     "core/v8/v8_dom_configuration.h",
                     "core/v8/v8_embedder_graph_builder.cc",
                     "core/v8/v8_embedder_graph_builder.h",
-                    "core/v8/v8_error_handler.cc",
-                    "core/v8/v8_error_handler.h",
-                    "core/v8/v8_event_listener_or_event_handler.cc",
-                    "core/v8/v8_event_listener_or_event_handler.h",
                     "core/v8/v8_event_listener_helper.cc",
                     "core/v8/v8_event_listener_helper.h",
                     "core/v8/v8_event_listener_info.h",
@@ -139,8 +133,6 @@
                     "core/v8/v8_throw_dom_exception.h",
                     "core/v8/v8_iterator_result_value.cc",
                     "core/v8/v8_iterator_result_value.h",
-                    "core/v8/v8_lazy_event_listener.cc",
-                    "core/v8/v8_lazy_event_listener.h",
                     "core/v8/v8_object_builder.cc",
                     "core/v8/v8_object_builder.h",
                     "core/v8/v8_object_parser.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc b/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc
index e10ff17..ef15fb17 100644
--- a/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc
@@ -113,7 +113,7 @@
 
   // Start a worker thread and create worlds on that.
   std::unique_ptr<WorkerBackingThread> thread = WorkerBackingThread::Create(
-      WebThreadCreationParams(WebThreadType::kTestThread)
+      ThreadCreationParams(WebThreadType::kTestThread)
           .SetThreadNameForTest("DOMWrapperWorld test thread"));
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner =
       Platform::Current()->CurrentThread()->GetTaskRunner();
diff --git a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc
index 1f60f55e..0ed5ed95 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_custom_element_definition.cc
@@ -8,7 +8,6 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_custom_element_constructor.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_custom_element_registry.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_element.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_error_handler.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_function.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.cc
index 8a275fd..4bd5bf7 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.cc
@@ -55,10 +55,10 @@
   running_task_ = false;
 }
 
-WebThread& ScriptStreamerThread::PlatformThread() {
+Thread& ScriptStreamerThread::PlatformThread() {
   if (!IsRunning()) {
     thread_ = Platform::Current()->CreateThread(
-        WebThreadCreationParams(WebThreadType::kScriptStreamerThread));
+        ThreadCreationParams(WebThreadType::kScriptStreamerThread));
   }
   return *thread_;
 }
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.h b/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.h
index a4a65c7..913aeae 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer_thread.h
@@ -44,11 +44,11 @@
 
   bool IsRunning() const { return !!thread_; }
 
-  WebThread& PlatformThread();
+  Thread& PlatformThread();
 
   // At the moment, we only use one thread, so we can only stream one script
   // at a time. FIXME: Use a thread pool and stream multiple scripts.
-  std::unique_ptr<WebThread> thread_;
+  std::unique_ptr<Thread> thread_;
   bool running_task_;
   mutable Mutex mutex_;  // Guards m_runningTask.
 
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.cc b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.cc
deleted file mode 100644
index 977319c..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.cc
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h"
-
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_event.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_helper.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_event_target.h"
-#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h"
-#include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/core/dom/document_parser.h"
-#include "third_party/blink/renderer/core/dom/events/event.h"
-#include "third_party/blink/renderer/core/dom/events/event_target.h"
-#include "third_party/blink/renderer/core/events/before_unload_event.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#include "third_party/blink/renderer/core/probe/core_probes.h"
-#include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h"
-#include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
-#include "third_party/blink/renderer/platform/instance_counters.h"
-
-namespace blink {
-
-V8AbstractEventHandler::V8AbstractEventHandler(v8::Isolate* isolate,
-                                               bool is_attribute,
-                                               DOMWrapperWorld& world)
-    : EventListener(kJSEventHandlerType),
-      is_attribute_(is_attribute),
-      world_(&world),
-      isolate_(isolate) {
-  if (IsMainThread()) {
-    InstanceCounters::IncrementCounter(
-        InstanceCounters::kJSEventListenerCounter);
-  }
-}
-
-V8AbstractEventHandler::~V8AbstractEventHandler() {
-  // For non-main threads a termination garbage collection clears out the
-  // wrapper links to CustomWrappable which result in CustomWrappable not being
-  // rooted by JavaScript objects anymore. This means that
-  // V8AbstractEventHandler can be collected without while still holding a
-  // valid weak references.
-  if (IsMainThread()) {
-    DCHECK(listener_.IsEmpty());
-    InstanceCounters::DecrementCounter(
-        InstanceCounters::kJSEventListenerCounter);
-  }
-}
-
-// static
-v8::Local<v8::Value> V8AbstractEventHandler::GetListenerOrNull(
-    v8::Isolate* isolate,
-    EventTarget* event_target,
-    EventListener* listener) {
-  if (listener && listener->GetType() == kJSEventHandlerType) {
-    v8::Local<v8::Object> v8_listener =
-        static_cast<V8AbstractEventHandler*>(listener)
-            ->GetListenerObjectInternal(event_target->GetExecutionContext());
-    if (!v8_listener.IsEmpty())
-      return v8_listener;
-  }
-  return v8::Null(isolate);
-}
-
-void V8AbstractEventHandler::handleEvent(ExecutionContext* execution_context,
-                                         Event* event) {
-  if (!execution_context)
-    return;
-  // Don't reenter V8 if execution was terminated in this instance of V8.
-  if (execution_context->IsJSExecutionForbidden())
-    return;
-
-  // A ScriptState used by the event listener needs to be calculated based on
-  // the ExecutionContext that fired the the event listener and the world
-  // that installed the event listener.
-  DCHECK(event);
-  v8::HandleScope handle_scope(ToIsolate(execution_context));
-  v8::Local<v8::Context> v8_context = ToV8Context(execution_context, World());
-  if (v8_context.IsEmpty())
-    return;
-  ScriptState* script_state = ScriptState::From(v8_context);
-  if (!script_state->ContextIsValid())
-    return;
-  HandleEvent(script_state, event);
-}
-
-void V8AbstractEventHandler::HandleEvent(ScriptState* script_state,
-                                         Event* event) {
-  ScriptState::Scope scope(script_state);
-
-  // Get the V8 wrapper for the event object.
-  v8::Local<v8::Value> js_event =
-      ToV8(event, script_state->GetContext()->Global(), GetIsolate());
-  if (js_event.IsEmpty())
-    return;
-  InvokeEventHandler(script_state, event,
-                     v8::Local<v8::Value>::New(GetIsolate(), js_event));
-}
-
-void V8AbstractEventHandler::SetListenerObject(
-    ScriptState* script_state,
-    v8::Local<v8::Object> listener,
-    const V8PrivateProperty::Symbol& property) {
-  DCHECK(listener_.IsEmpty());
-  listener_.Set(GetIsolate(), listener, this, &WrapperCleared);
-  Attach(script_state, listener, property, this);
-}
-
-void V8AbstractEventHandler::InvokeEventHandler(ScriptState* script_state,
-                                                Event* event,
-                                                v8::Local<v8::Value> js_event) {
-  if (!event->CanBeDispatchedInWorld(World()))
-    return;
-
-  v8::Local<v8::Value> return_value;
-  v8::Local<v8::Context> context = script_state->GetContext();
-  {
-    // Catch exceptions thrown in the event handler so they do not propagate to
-    // javascript code that caused the event to fire.
-    v8::TryCatch try_catch(GetIsolate());
-    try_catch.SetVerbose(true);
-
-    v8::Local<v8::Object> global = context->Global();
-    V8PrivateProperty::Symbol event_symbol =
-        V8PrivateProperty::GetGlobalEvent(GetIsolate());
-    // Save the old 'event' property so we can restore it later.
-    v8::Local<v8::Value> saved_event;
-    if (!event_symbol.GetOrUndefined(global).ToLocal(&saved_event))
-      return;
-    try_catch.Reset();
-
-    // Expose the event object as |window.event|, except when the event's target
-    // is in a V1 shadow tree, in which case |window.event| should be
-    // |undefined|.
-    Node* target_node = event->target()->ToNode();
-    if (target_node && target_node->IsInV1ShadowTree()) {
-      event_symbol.Set(global, v8::Undefined(GetIsolate()));
-    } else {
-      event_symbol.Set(global, js_event);
-    }
-    try_catch.Reset();
-
-    return_value = CallListenerFunction(script_state, js_event, event);
-    if (try_catch.HasCaught())
-      event->LegacySetDidListenersThrowFlag();
-
-    if (!try_catch.CanContinue()) {  // Result of TerminateExecution().
-      ExecutionContext* execution_context = ToExecutionContext(context);
-      if (auto* scope =
-              DynamicTo<WorkerOrWorkletGlobalScope>(execution_context))
-        scope->ScriptController()->ForbidExecution();
-      return;
-    }
-    try_catch.Reset();
-
-    // Restore the old event. This must be done for all exit paths through this
-    // method.
-    event_symbol.Set(global, saved_event);
-    try_catch.Reset();
-  }
-
-  if (return_value.IsEmpty())
-    return;
-
-  // Because OnBeforeUnloadEventHandler is currently not implemented, the
-  // following special handling of BeforeUnloadEvents and events with the type
-  // beforeunload is needed in accordance with the spec at
-  // https://html.spec.whatwg.org/multipage/webappapis.html#the-event-handler-processing-algorithm
-  // TODO(rakina): remove special handling after OnBeforeUnloadEventHandler
-  // is implemented
-
-  if (!is_attribute_) {
-    return;
-  }
-
-  if (event->IsBeforeUnloadEvent() &&
-      event->type() == EventTypeNames::beforeunload) {
-    if (!return_value->IsUndefined() && !return_value->IsNull()) {
-      event->preventDefault();
-      if (ToBeforeUnloadEvent(event)->returnValue().IsEmpty()) {
-        TOSTRING_VOID(V8StringResource<>, string_return_value, return_value);
-        ToBeforeUnloadEvent(event)->setReturnValue(string_return_value);
-      }
-    }
-  } else if (ShouldPreventDefault(return_value, event) &&
-             event->type() != EventTypeNames::beforeunload) {
-    event->preventDefault();
-  }
-}
-
-bool V8AbstractEventHandler::ShouldPreventDefault(
-    v8::Local<v8::Value> return_value,
-    Event*) {
-  // Prevent default action if the return value is false in accord with the spec
-  // http://www.w3.org/TR/html5/webappapis.html#event-handler-attributes
-  return return_value->IsBoolean() && !return_value.As<v8::Boolean>()->Value();
-}
-
-v8::Local<v8::Object> V8AbstractEventHandler::GetReceiverObject(
-    ScriptState* script_state,
-    Event* event) {
-  v8::Local<v8::Object> listener = listener_.NewLocal(GetIsolate());
-  if (!listener_.IsEmpty() && !listener->IsFunction())
-    return listener;
-
-  EventTarget* target = event->currentTarget();
-  v8::Local<v8::Value> value =
-      ToV8(target, script_state->GetContext()->Global(), GetIsolate());
-  if (value.IsEmpty())
-    return v8::Local<v8::Object>();
-  return v8::Local<v8::Object>::New(GetIsolate(),
-                                    v8::Local<v8::Object>::Cast(value));
-}
-
-bool V8AbstractEventHandler::BelongsToTheCurrentWorld(
-    ExecutionContext* execution_context) const {
-  if (!GetIsolate()->GetCurrentContext().IsEmpty() &&
-      &World() == &DOMWrapperWorld::Current(GetIsolate()))
-    return true;
-  // If currently parsing, the parser could be accessing this listener
-  // outside of any v8 context; check if it belongs to the main world.
-  if (GetIsolate()->InContext())
-    return false;
-  auto* document = DynamicTo<Document>(execution_context);
-  if (!document)
-    return false;
-  return document->Parser() && document->Parser()->IsParsing() &&
-         World().IsMainWorld();
-}
-
-void V8AbstractEventHandler::ClearListenerObject() {
-  if (!HasExistingListenerObject())
-    return;
-  probe::AsyncTaskCanceled(GetIsolate(), this);
-  listener_.Clear();
-}
-
-void V8AbstractEventHandler::WrapperCleared(
-    const v8::WeakCallbackInfo<V8AbstractEventHandler>& data) {
-  data.GetParameter()->ClearListenerObject();
-}
-
-void V8AbstractEventHandler::Trace(blink::Visitor* visitor) {
-  visitor->Trace(listener_.Cast<v8::Value>());
-  EventListener::Trace(visitor);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h
deleted file mode 100644
index 6b9639e..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_HANDLER_H_
-#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_HANDLER_H_
-
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/dom/events/event_listener.h"
-#include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h"
-#include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
-#include "third_party/blink/renderer/platform/heap/self_keep_alive.h"
-#include "v8/include/v8.h"
-
-namespace blink {
-
-class Event;
-class EventTarget;
-
-// There are two kinds of event listeners: HTML or non-HMTL. onload,
-// onfocus, etc (attributes) are always HTML event handler type; Event
-// listeners added by Window.addEventListener or
-// EventTargetNode::addEventListener are non-HTML type.
-//
-// Why does this matter?
-// WebKit does not allow duplicated HTML event handlers of the same type,
-// but ALLOWs duplicated non-HTML event handlers.
-class CORE_EXPORT V8AbstractEventHandler : public EventListener {
- public:
-  ~V8AbstractEventHandler() override;
-
-  static const V8AbstractEventHandler* Cast(const EventListener* listener) {
-    return listener->GetType() == kJSEventHandlerType
-               ? static_cast<const V8AbstractEventHandler*>(listener)
-               : nullptr;
-  }
-
-  static V8AbstractEventHandler* Cast(EventListener* listener) {
-    return const_cast<V8AbstractEventHandler*>(
-        Cast(const_cast<const EventListener*>(listener)));
-  }
-
-  static v8::Local<v8::Value> GetListenerOrNull(v8::Isolate*,
-                                                EventTarget*,
-                                                EventListener*);
-
-  // Implementation of EventListener interface.
-
-  bool operator==(const EventListener& other) const override {
-    return this == &other;
-  }
-
-  void handleEvent(ExecutionContext*, Event*) final;
-  virtual void HandleEvent(ScriptState*, Event*);
-
-  // Returns the listener object, either a function or an object, or the empty
-  // handle if the user script is not compilable.  No exception will be thrown
-  // even if the user script is not compilable.
-  v8::Local<v8::Object> GetListenerObjectForInspector(
-      ExecutionContext* execution_context) final {
-    return GetListenerObjectInternal(execution_context);
-  }
-
-  v8::Local<v8::Object> GetListenerObject(ExecutionContext* execution_context) {
-    return GetListenerObjectInternal(execution_context);
-  }
-
-  v8::Local<v8::Object> GetExistingListenerObject() {
-    return listener_.NewLocal(isolate_);
-  }
-
-  // Provides access to the underlying handle for GC. Returned
-  // value is a weak handle and so not guaranteed to stay alive.
-  v8::Persistent<v8::Object>& ExistingListenerObjectPersistentHandle() {
-    return listener_.Get();
-  }
-
-  bool HasExistingListenerObject() { return !listener_.IsEmpty(); }
-
-  void ClearListenerObject();
-
-  bool BelongsToTheCurrentWorld(ExecutionContext*) const final;
-
-  bool IsEventHandler() const final { return is_attribute_; }
-
-  v8::Isolate* GetIsolate() const { return isolate_; }
-  DOMWrapperWorld* GetWorldPtrForInspector() const final {
-    return world_.get();
-  }
-
-  void Trace(blink::Visitor*) override;
-
- protected:
-  V8AbstractEventHandler(v8::Isolate*, bool is_attribute, DOMWrapperWorld&);
-
-  virtual v8::Local<v8::Object> GetListenerObjectInternal(
-      ExecutionContext* execution_context) {
-    return GetExistingListenerObject();
-  }
-
-  void SetListenerObject(ScriptState*,
-                         v8::Local<v8::Object>,
-                         const V8PrivateProperty::Symbol&);
-
-  void InvokeEventHandler(ScriptState*, Event*, v8::Local<v8::Value>);
-
-  // Get the receiver object to use for event listener call.
-  v8::Local<v8::Object> GetReceiverObject(ScriptState*, Event*);
-  DOMWrapperWorld& World() const { return *world_; }
-
- private:
-  // This could return an empty handle and callers need to check return value.
-  // We don't use v8::MaybeLocal because it can fail without exception.
-  virtual v8::Local<v8::Value>
-  CallListenerFunction(ScriptState*, v8::Local<v8::Value> jsevent, Event*) = 0;
-
-  virtual bool ShouldPreventDefault(v8::Local<v8::Value> return_value, Event*);
-
-  static void WrapperCleared(
-      const v8::WeakCallbackInfo<V8AbstractEventHandler>&);
-
-  TraceWrapperV8Reference<v8::Object> listener_;
-
-  // true if the listener is created through a DOM attribute.
-  bool is_attribute_;
-
-  scoped_refptr<DOMWrapperWorld> world_;
-  v8::Isolate* isolate_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ABSTRACT_EVENT_HANDLER_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_error_handler.cc b/third_party/blink/renderer/bindings/core/v8/v8_error_handler.cc
deleted file mode 100644
index fe8763d1..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_error_handler.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/bindings/core/v8/v8_error_handler.h"
-
-#include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_error_event.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
-
-namespace blink {
-
-V8ErrorHandler::V8ErrorHandler(bool is_inline, ScriptState* script_state)
-    : V8EventListenerOrEventHandler(is_inline, script_state) {}
-
-v8::Local<v8::Value> V8ErrorHandler::CallListenerFunction(
-    ScriptState* script_state,
-    v8::Local<v8::Value> js_event,
-    Event* event) {
-  DCHECK(!js_event.IsEmpty());
-  if (!event->HasInterface(EventNames::ErrorEvent)) {
-    return V8EventListenerOrEventHandler::CallListenerFunction(script_state,
-                                                               js_event, event);
-  }
-
-  ErrorEvent* error_event = static_cast<ErrorEvent*>(event);
-  v8::Local<v8::Context> context = script_state->GetContext();
-  ExecutionContext* execution_context = ToExecutionContext(context);
-  v8::Local<v8::Object> listener = GetListenerObjectInternal(execution_context);
-  if (listener.IsEmpty() || !listener->IsFunction())
-    return v8::Null(GetIsolate());
-
-  v8::Local<v8::Function> call_function =
-      v8::Local<v8::Function>::Cast(listener);
-  v8::Local<v8::Object> this_value = context->Global();
-
-  // The error attribute should be initialized to null for dedicated workers.
-  // https://html.spec.whatwg.org/multipage/workers.html#runtime-script-errors-2
-  ScriptValue error = error_event->error(script_state);
-  v8::Local<v8::Value> error_value =
-      (error.IsEmpty() ||
-       error_event->target()->InterfaceName() == EventTargetNames::Worker)
-          ? v8::Local<v8::Value>(v8::Null(GetIsolate()))
-          : error.V8Value();
-
-  v8::Local<v8::Value> parameters[5] = {
-      V8String(GetIsolate(), error_event->message()),
-      V8String(GetIsolate(), error_event->filename()),
-      v8::Integer::New(GetIsolate(), error_event->lineno()),
-      v8::Integer::New(GetIsolate(), error_event->colno()), error_value};
-  v8::TryCatch try_catch(GetIsolate());
-  try_catch.SetVerbose(true);
-
-  v8::MaybeLocal<v8::Value> result = V8ScriptRunner::CallFunction(
-      call_function, execution_context, this_value, base::size(parameters),
-      parameters, GetIsolate());
-  v8::Local<v8::Value> return_value;
-  if (!result.ToLocal(&return_value))
-    return v8::Null(GetIsolate());
-
-  return return_value;
-}
-
-bool V8ErrorHandler::ShouldPreventDefault(v8::Local<v8::Value> return_value,
-                                          Event* event) {
-  // Special event handling should be done here according to HTML Standard:
-  // https://html.spec.whatwg.org/multipage/webappapis.html#the-event-handler-processing-algorithm
-  // We do not need to check current target of event because it must be window
-  // or worker on calling this method.
-  if (event->HasInterface(EventNames::ErrorEvent) && event->type() == "error")
-    return return_value->IsBoolean() && return_value.As<v8::Boolean>()->Value();
-  return return_value->IsBoolean() && !return_value.As<v8::Boolean>()->Value();
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_error_handler.h b/third_party/blink/renderer/bindings/core/v8/v8_error_handler.h
deleted file mode 100644
index 0f848a7..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_error_handler.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ERROR_HANDLER_H_
-#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ERROR_HANDLER_H_
-
-#include "base/memory/scoped_refptr.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h"
-#include "v8/include/v8.h"
-
-namespace blink {
-
-class V8ErrorHandler final : public V8EventListenerOrEventHandler {
- public:
-  static V8ErrorHandler* Create(v8::Local<v8::Object> listener,
-                                bool is_inline,
-                                ScriptState* script_state,
-                                const V8PrivateProperty::Symbol& property) {
-    V8ErrorHandler* event_listener =
-        new V8ErrorHandler(is_inline, script_state);
-    event_listener->SetListenerObject(script_state, listener, property);
-    return event_listener;
-  }
-
- private:
-  V8ErrorHandler(bool is_inline, ScriptState*);
-  v8::Local<v8::Value> CallListenerFunction(ScriptState*,
-                                            v8::Local<v8::Value>,
-                                            Event*) override;
-  bool ShouldPreventDefault(v8::Local<v8::Value> return_value, Event*) override;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ERROR_HANDLER_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.cc b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.cc
deleted file mode 100644
index 41de9ec4..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h"
-
-#include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/core/dom/events/event.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#include "third_party/blink/renderer/core/frame/local_frame.h"
-
-namespace blink {
-
-V8EventListenerOrEventHandler::V8EventListenerOrEventHandler(
-    bool is_attribute,
-    ScriptState* script_state)
-    : V8AbstractEventHandler(script_state->GetIsolate(),
-                             is_attribute,
-                             script_state->World()) {}
-
-v8::Local<v8::Function> V8EventListenerOrEventHandler::GetListenerFunction(
-    ScriptState* script_state) {
-  v8::Local<v8::Object> listener =
-      GetListenerObjectInternal(ExecutionContext::From(script_state));
-
-  // Has the listener been disposed?
-  if (listener.IsEmpty())
-    return v8::Local<v8::Function>();
-
-  if (listener->IsFunction())
-    return v8::Local<v8::Function>::Cast(listener);
-
-  // The EventHandler callback function type (used for event handler
-  // attributes in HTML) has [TreatNonObjectAsNull], which implies that
-  // non-function objects should be treated as no-op functions that return
-  // undefined.
-  if (IsEventHandler())
-    return v8::Local<v8::Function>();
-
-  // Getting the handleEvent property can runs script in the getter.
-  if (ScriptForbiddenScope::IsScriptForbidden()) {
-    V8ThrowException::ThrowError(GetIsolate(),
-                                 "Script execution is forbidden.");
-    return v8::Local<v8::Function>();
-  }
-
-  if (listener->IsObject()) {
-    // Check that no exceptions were thrown when getting the
-    // handleEvent property and that the value is a function.
-    v8::Local<v8::Value> property;
-    if (listener
-            ->Get(script_state->GetContext(),
-                  V8AtomicString(GetIsolate(), "handleEvent"))
-            .ToLocal(&property) &&
-        property->IsFunction())
-      return v8::Local<v8::Function>::Cast(property);
-  }
-
-  return v8::Local<v8::Function>();
-}
-
-v8::Local<v8::Value> V8EventListenerOrEventHandler::CallListenerFunction(
-    ScriptState* script_state,
-    v8::Local<v8::Value> js_event,
-    Event* event) {
-  DCHECK(!js_event.IsEmpty());
-  v8::Local<v8::Function> handler_function = GetListenerFunction(script_state);
-  v8::Local<v8::Object> receiver = GetReceiverObject(script_state, event);
-  if (handler_function.IsEmpty() || receiver.IsEmpty())
-    return v8::Local<v8::Value>();
-
-  ExecutionContext* execution_context =
-      ToExecutionContext(script_state->GetContext());
-
-  // TODO(jochen): Consider moving this check into canExecuteScripts.
-  // http://crbug.com/608641
-  if (script_state->World().IsMainWorld() &&
-      !execution_context->CanExecuteScripts(kAboutToExecuteScript))
-    return v8::Local<v8::Value>();
-
-  v8::Local<v8::Value> parameters[1] = {js_event};
-  v8::Local<v8::Value> result;
-  if (!V8ScriptRunner::CallFunction(handler_function, execution_context,
-                                    receiver, base::size(parameters),
-                                    parameters, script_state->GetIsolate())
-           .ToLocal(&result))
-    return v8::Local<v8::Value>();
-  return result;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h b/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h
deleted file mode 100644
index b858e0c..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_event_listener_or_event_handler.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_EVENT_LISTENER_OR_EVENT_HANDLER_H_
-#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_EVENT_LISTENER_OR_EVENT_HANDLER_H_
-
-#include "base/memory/scoped_refptr.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h"
-#include "v8/include/v8.h"
-
-namespace blink {
-
-class Event;
-
-// V8EventListenerOrEventHandler is a wrapper of a JS object implements
-// EventListener interface (has handleEvent(event) method), or a JS function
-// that can handle the event.
-class V8EventListenerOrEventHandler : public V8AbstractEventHandler {
- public:
-  static V8EventListenerOrEventHandler* Create(
-      v8::Local<v8::Object> listener,
-      bool is_attribute,
-      ScriptState* script_state,
-      const V8PrivateProperty::Symbol& property) {
-    V8EventListenerOrEventHandler* event_listener =
-        new V8EventListenerOrEventHandler(is_attribute, script_state);
-    event_listener->SetListenerObject(script_state, listener, property);
-    return event_listener;
-  }
-
- protected:
-  V8EventListenerOrEventHandler(bool is_attribute, ScriptState*);
-  v8::Local<v8::Function> GetListenerFunction(ScriptState*);
-  v8::Local<v8::Value> CallListenerFunction(ScriptState*,
-                                            v8::Local<v8::Value>,
-                                            Event*) override;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_EVENT_LISTENER_OR_EVENT_HANDLER_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.cc b/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.cc
deleted file mode 100644
index 152eea82..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h"
-
-#include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_source_code.h"
-#include "third_party/blink/renderer/bindings/core/v8/source_location.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_document.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_html_form_element.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_node.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
-#include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/core/dom/node.h"
-#include "third_party/blink/renderer/core/events/error_event.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
-#include "third_party/blink/renderer/core/frame/local_frame.h"
-#include "third_party/blink/renderer/core/html/forms/html_form_element.h"
-#include "third_party/blink/renderer/core/html/html_element.h"
-#include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h"
-#include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
-#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
-
-namespace blink {
-
-V8LazyEventListener::V8LazyEventListener(v8::Isolate* isolate,
-                                         DOMWrapperWorld& world,
-                                         const AtomicString& function_name,
-                                         const String& code,
-                                         const String source_url,
-                                         const TextPosition& position,
-                                         Node* node)
-    : V8AbstractEventHandler(isolate, true, world),
-      was_compilation_failed_(false),
-      function_name_(function_name),
-      code_(code),
-      source_url_(source_url),
-      node_(node),
-      position_(position) {}
-
-template <typename T>
-v8::Local<v8::Object> ToObjectWrapper(T* dom_object,
-                                      ScriptState* script_state) {
-  if (!dom_object)
-    return v8::Object::New(script_state->GetIsolate());
-  v8::Local<v8::Value> value =
-      ToV8(dom_object, script_state->GetContext()->Global(),
-           script_state->GetIsolate());
-  if (value.IsEmpty())
-    return v8::Object::New(script_state->GetIsolate());
-  return v8::Local<v8::Object>::New(script_state->GetIsolate(),
-                                    value.As<v8::Object>());
-}
-
-v8::Local<v8::Value> V8LazyEventListener::CallListenerFunction(
-    ScriptState* script_state,
-    v8::Local<v8::Value> js_event,
-    Event* event) {
-  DCHECK(!js_event.IsEmpty());
-  ExecutionContext* execution_context =
-      ToExecutionContext(script_state->GetContext());
-  v8::Local<v8::Object> listener_object =
-      GetListenerObjectInternal(execution_context);
-  if (listener_object.IsEmpty())
-    return v8::Local<v8::Value>();
-
-  v8::Local<v8::Function> handler_function = listener_object.As<v8::Function>();
-  v8::Local<v8::Object> receiver = GetReceiverObject(script_state, event);
-  if (handler_function.IsEmpty() || receiver.IsEmpty())
-    return v8::Local<v8::Value>();
-
-  auto* document = DynamicTo<Document>(execution_context);
-  if (!document)
-    return v8::Local<v8::Value>();
-
-  LocalFrame* frame = document->GetFrame();
-  if (!frame)
-    return v8::Local<v8::Value>();
-
-  if (!execution_context->CanExecuteScripts(kAboutToExecuteScript))
-    return v8::Local<v8::Value>();
-
-  v8::Local<v8::Value> parameters[1] = {js_event};
-  v8::Local<v8::Value> result;
-  // TODO(dcheng): document.GetFrame()->GetDocument() == document should always
-  // hold if GetFrame() is non-null.
-  if (!V8ScriptRunner::CallFunction(handler_function, frame->GetDocument(),
-                                    receiver, base::size(parameters),
-                                    parameters, script_state->GetIsolate())
-           .ToLocal(&result))
-    return v8::Local<v8::Value>();
-  return result;
-}
-
-v8::Local<v8::Object> V8LazyEventListener::GetListenerObjectInternal(
-    ExecutionContext* execution_context) {
-  if (!execution_context)
-    return v8::Local<v8::Object>();
-
-  // A ScriptState used by the event listener needs to be calculated based on
-  // the ExecutionContext that fired the the event listener and the world
-  // that installed the event listener.
-  v8::EscapableHandleScope handle_scope(ToIsolate(execution_context));
-  v8::Local<v8::Context> v8_context = ToV8Context(execution_context, World());
-  if (v8_context.IsEmpty())
-    return v8::Local<v8::Object>();
-  ScriptState* script_state = ScriptState::From(v8_context);
-  if (!script_state->ContextIsValid())
-    return v8::Local<v8::Object>();
-
-  Document* document = DynamicTo<Document>(execution_context);
-  if (!document || !document->AllowInlineEventHandler(node_, this, source_url_,
-                                                      position_.line_))
-    return v8::Local<v8::Object>();
-
-  // All checks passed and it's now okay to return the function object.
-
-  // We may need to compile the same script twice or more because the compiled
-  // function object may be garbage-collected, however, we should behave as if
-  // we compile the code only once, i.e. we must not throw an error twice.
-  if (!HasExistingListenerObject() && !was_compilation_failed_)
-    CompileScript(script_state, execution_context);
-
-  return handle_scope.Escape(GetExistingListenerObject());
-}
-
-void V8LazyEventListener::CompileScript(ScriptState* script_state,
-                                        ExecutionContext* execution_context) {
-  DCHECK(!HasExistingListenerObject());
-
-  ScriptState::Scope scope(script_state);
-
-  // Nodes other than the document object, when executing inline event
-  // handlers push document, form owner, and the target node on the scope chain.
-  // We do this by using 'with' statement.
-  // See fast/forms/form-action.html
-  //     fast/forms/selected-index-value.html
-  //     fast/overflow/onscroll-layer-self-destruct.html
-  HTMLFormElement* form_element = nullptr;
-  if (node_ && node_->IsHTMLElement())
-    form_element = ToHTMLElement(node_)->formOwner();
-
-  v8::Local<v8::Object> scopes[3];
-  scopes[2] = ToObjectWrapper<Node>(node_, script_state);
-  scopes[1] = ToObjectWrapper<HTMLFormElement>(form_element, script_state);
-  scopes[0] = ToObjectWrapper<Document>(
-      node_ ? node_->ownerDocument() : nullptr, script_state);
-
-  // SVG requires to introduce evt as an alias to event in event handlers.
-  // See ANNOTATION 3: https://www.w3.org/TR/SVG/interact.html#SVGEvents
-  v8::Local<v8::String> parameter_name =
-      V8String(GetIsolate(), node_ && node_->IsSVGElement() ? "evt" : "event");
-
-  v8::ScriptOrigin origin(
-      V8String(GetIsolate(), source_url_),
-      v8::Integer::New(GetIsolate(), position_.line_.ZeroBasedInt()),
-      v8::Integer::New(GetIsolate(), position_.column_.ZeroBasedInt()),
-      v8::True(GetIsolate()));
-  v8::ScriptCompiler::Source source(V8String(GetIsolate(), code_), origin);
-
-  v8::Local<v8::Function> wrapped_function;
-  {
-    // JavaScript compilation error shouldn't be reported as a runtime
-    // exception because we're not running any program code.  Instead,
-    // it should be reported as an ErrorEvent.
-    v8::TryCatch block(GetIsolate());
-    v8::MaybeLocal<v8::Function> maybe_result =
-        v8::ScriptCompiler::CompileFunctionInContext(
-            script_state->GetContext(), &source, 1, &parameter_name, 3, scopes);
-    if (!maybe_result.ToLocal(&wrapped_function)) {
-      was_compilation_failed_ = true;  // Do not compile the same code twice.
-      FireErrorEvent(script_state->GetContext(), execution_context,
-                     block.Message());
-      return;
-    }
-  }
-
-  wrapped_function->SetName(V8String(GetIsolate(), function_name_));
-
-  SetListenerObject(
-      script_state, wrapped_function,
-      V8PrivateProperty::GetCustomWrappableEventListener(GetIsolate()));
-}
-
-void V8LazyEventListener::FireErrorEvent(v8::Local<v8::Context> v8_context,
-                                         ExecutionContext* execution_context,
-                                         v8::Local<v8::Message> message) {
-  ErrorEvent* event = ErrorEvent::Create(
-      ToCoreStringWithNullCheck(message->Get()),
-      SourceLocation::FromMessage(GetIsolate(), message, execution_context),
-      &World());
-
-  AccessControlStatus access_control_status = kOpaqueResource;
-  if (message->IsOpaque())
-    access_control_status = kOpaqueResource;
-  else if (message->IsSharedCrossOrigin())
-    access_control_status = kSharableCrossOrigin;
-  else
-    NOTREACHED();
-
-  execution_context->DispatchErrorEvent(event, access_control_status);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h b/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h
deleted file mode 100644
index 364238c..0000000
--- a/third_party/blink/renderer/bindings/core/v8/v8_lazy_event_listener.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_LAZY_EVENT_LISTENER_H_
-#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_LAZY_EVENT_LISTENER_H_
-
-#include "base/memory/scoped_refptr.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_abstract_event_handler.h"
-#include "third_party/blink/renderer/platform/wtf/text/text_position.h"
-#include "v8/include/v8.h"
-
-namespace blink {
-
-class Event;
-class Node;
-
-// V8LazyEventListener is a wrapper for a JavaScript code string that is
-// compiled and evaluated when an event is fired.  A V8LazyEventListener is
-// either a HTML or SVG event handler.
-class V8LazyEventListener final : public V8AbstractEventHandler {
- public:
-  static V8LazyEventListener* Create(const AtomicString& function_name,
-                                     const String& code,
-                                     const String& source_url,
-                                     const TextPosition& position,
-                                     Node* node,
-                                     v8::Isolate* isolate,
-                                     DOMWrapperWorld& world) {
-    return new V8LazyEventListener(isolate, world, function_name, code,
-                                   source_url, position, node);
-  }
-
-  void Trace(blink::Visitor* visitor) override {
-    visitor->Trace(node_);
-    V8AbstractEventHandler::Trace(visitor);
-  }
-
-  const String& Code() const override { return code_; }
-
- protected:
-  v8::Local<v8::Object> GetListenerObjectInternal(ExecutionContext*) override;
-
- private:
-  V8LazyEventListener(v8::Isolate*,
-                      DOMWrapperWorld&,
-                      const AtomicString& function_name,
-                      const String& code,
-                      const String source_url,
-                      const TextPosition&,
-                      Node*);
-
-  v8::Local<v8::Value> CallListenerFunction(ScriptState*,
-                                            v8::Local<v8::Value>,
-                                            Event*) override;
-
-  // Return true, so that event handlers from markup are not cloned twice when
-  // building the shadow tree for SVGUseElements.
-  bool IsEventHandlerForContentAttribute() const override { return true; }
-
-  void CompileScript(ScriptState*, ExecutionContext*);
-
-  void FireErrorEvent(v8::Local<v8::Context>,
-                      ExecutionContext*,
-                      v8::Local<v8::Message>);
-
-  bool was_compilation_failed_;
-  AtomicString function_name_;
-  String code_;
-  String source_url_;
-  Member<Node> node_;
-  TextPosition position_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_LAZY_EVENT_LISTENER_H_
diff --git a/third_party/blink/renderer/controller/blink_initializer.cc b/third_party/blink/renderer/controller/blink_initializer.cc
index a47a2bf..90ff552 100644
--- a/third_party/blink/renderer/controller/blink_initializer.cc
+++ b/third_party/blink/renderer/controller/blink_initializer.cc
@@ -65,7 +65,7 @@
 
 namespace {
 
-class EndOfTaskRunner : public WebThread::TaskObserver {
+class EndOfTaskRunner : public Thread::TaskObserver {
  public:
   void WillProcessTask() override { AnimationClock::NotifyTaskStart(); }
   void DidProcessTask() override {
@@ -74,7 +74,7 @@
   }
 };
 
-WebThread::TaskObserver* g_end_of_task_runner = nullptr;
+Thread::TaskObserver* g_end_of_task_runner = nullptr;
 
 BlinkInitializer& GetBlinkInitializer() {
   DEFINE_STATIC_LOCAL(std::unique_ptr<BlinkInitializer>, initializer,
@@ -122,18 +122,24 @@
   GetBlinkInitializer().RegisterInterfaces(*registry);
 
   // currentThread is null if we are running on a thread without a message loop.
-  if (WebThread* current_thread = platform->CurrentThread()) {
+  if (Thread* current_thread = platform->CurrentThread()) {
     DCHECK(!g_end_of_task_runner);
     g_end_of_task_runner = new EndOfTaskRunner;
     current_thread->AddTaskObserver(g_end_of_task_runner);
   }
 
-  if (WebThread* main_thread = Platform::Current()->MainThread()) {
+  if (Thread* main_thread = Platform::Current()->MainThread()) {
     scoped_refptr<base::SequencedTaskRunner> task_runner =
         main_thread->GetTaskRunner();
     if (task_runner)
       MemoryAblationExperiment::MaybeStartForRenderer(task_runner);
   }
+
+#if defined(OS_ANDROID)
+  // Initialize CrashMemoryMetricsReporterImpl in order to assure that memory
+  // allocation does not happen in OnOOMCallback.
+  CrashMemoryMetricsReporterImpl::Instance();
+#endif
 }
 
 }  // namespace
@@ -156,7 +162,7 @@
 void BlinkInitializer::RegisterInterfaces(
     service_manager::BinderRegistry& registry) {
   ModulesInitializer::RegisterInterfaces(registry);
-  WebThread* main_thread = Platform::Current()->MainThread();
+  Thread* main_thread = Platform::Current()->MainThread();
   // GetSingleThreadTaskRunner() uses GetTaskRunner() internally.
   // crbug.com/781664
   if (!main_thread || !main_thread->GetTaskRunner())
diff --git a/third_party/blink/renderer/core/css/cssom/style_property_map.cc b/third_party/blink/renderer/core/css/cssom/style_property_map.cc
index 3ed017c..adc08f0 100644
--- a/third_party/blink/renderer/core/css/cssom/style_property_map.cc
+++ b/third_party/blink/renderer/core/css/cssom/style_property_map.cc
@@ -241,44 +241,22 @@
   if (values.IsEmpty())
     return nullptr;
 
-  const CSSParserContext* parser_context = nullptr;
+  CSSStyleValueVector style_values =
+      StyleValueFactory::CoerceStyleValuesOrStrings(
+          property, custom_property_name, nullptr, values, execution_context);
 
-  HeapVector<Member<const CSSValue>> css_values;
-  for (const auto& value : values) {
-    if (value.IsCSSStyleValue()) {
-      if (!value.GetAsCSSStyleValue())
-        return nullptr;
-
-      css_values.push_back(
-          StyleValueToCSSValue(property, custom_property_name, nullptr,
-                               *value.GetAsCSSStyleValue(), execution_context));
-    } else {
-      DCHECK(value.IsString());
-      if (!parser_context)
-        parser_context = CSSParserContext::Create(execution_context);
-
-      const auto subvalues = StyleValueFactory::FromString(
-          property.PropertyID(), custom_property_name, nullptr,
-          value.GetAsString(), parser_context);
-      if (subvalues.IsEmpty())
-        return nullptr;
-
-      for (const auto& subvalue : subvalues) {
-        DCHECK(subvalue);
-        css_values.push_back(
-            StyleValueToCSSValue(property, custom_property_name, nullptr,
-                                 *subvalue, execution_context));
-      }
-    }
-  }
+  if (style_values.IsEmpty())
+    return nullptr;
 
   CSSValueList* result = CssValueListForPropertyID(property.PropertyID());
-  for (const auto& css_value : css_values) {
+  for (const auto& style_value : style_values) {
+    const CSSValue* css_value =
+        StyleValueToCSSValue(property, custom_property_name, nullptr,
+                             *style_value, execution_context);
     if (!css_value)
       return nullptr;
     if (css_value->IsCSSWideKeyword() || css_value->IsVariableReferenceValue())
-      return css_values.size() == 1U ? css_value : nullptr;
-
+      return style_values.size() == 1U ? css_value : nullptr;
     result->Append(*css_value);
   }
 
diff --git a/third_party/blink/renderer/core/css/cssom/style_value_factory.cc b/third_party/blink/renderer/core/css/cssom/style_value_factory.cc
index 551d565..29b7fd0 100644
--- a/third_party/blink/renderer/core/css/cssom/style_value_factory.cc
+++ b/third_party/blink/renderer/core/css/cssom/style_value_factory.cc
@@ -305,6 +305,38 @@
   return style_value;
 }
 
+CSSStyleValueVector StyleValueFactory::CoerceStyleValuesOrStrings(
+    const CSSProperty& property,
+    const AtomicString& custom_property_name,
+    const PropertyRegistration* registration,
+    const HeapVector<CSSStyleValueOrString>& values,
+    const ExecutionContext& execution_context) {
+  const CSSParserContext* parser_context = nullptr;
+
+  CSSStyleValueVector style_values;
+  for (const auto& value : values) {
+    if (value.IsCSSStyleValue()) {
+      if (!value.GetAsCSSStyleValue())
+        return CSSStyleValueVector();
+      style_values.push_back(*value.GetAsCSSStyleValue());
+    } else {
+      DCHECK(value.IsString());
+      if (!parser_context)
+        parser_context = CSSParserContext::Create(execution_context);
+
+      const auto subvalues = StyleValueFactory::FromString(
+          property.PropertyID(), custom_property_name, registration,
+          value.GetAsString(), parser_context);
+      if (subvalues.IsEmpty())
+        return CSSStyleValueVector();
+
+      DCHECK(!subvalues.Contains(nullptr));
+      style_values.AppendVector(subvalues);
+    }
+  }
+  return style_values;
+}
+
 CSSStyleValueVector StyleValueFactory::CssValueToStyleValueVector(
     CSSPropertyID property_id,
     const AtomicString& custom_property_name,
diff --git a/third_party/blink/renderer/core/css/cssom/style_value_factory.h b/third_party/blink/renderer/core/css/cssom/style_value_factory.h
index 858fc72..603aa2f6 100644
--- a/third_party/blink/renderer/core/css/cssom/style_value_factory.h
+++ b/third_party/blink/renderer/core/css/cssom/style_value_factory.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_STYLE_VALUE_FACTORY_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_STYLE_VALUE_FACTORY_H_
 
+#include "third_party/blink/renderer/bindings/core/v8/css_style_value_or_string.h"
 #include "third_party/blink/renderer/core/css/cssom/css_style_value.h"
 #include "third_party/blink/renderer/core/css_property_names.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
@@ -12,7 +13,9 @@
 namespace blink {
 
 class CSSParserContext;
+class CSSProperty;
 class CSSValue;
+class ExecutionContext;
 class PropertyRegistration;
 
 class CORE_EXPORT StyleValueFactory {
@@ -33,6 +36,13 @@
       CSSPropertyID,
       const AtomicString& custom_property_name,
       const CSSValue&);
+  // Returns an empty vector on error conditions.
+  static CSSStyleValueVector CoerceStyleValuesOrStrings(
+      const CSSProperty& property,
+      const AtomicString& custom_property_name,
+      const PropertyRegistration*,
+      const HeapVector<CSSStyleValueOrString>& values,
+      const ExecutionContext&);
   // If you don't have complex CSS properties, use this one.
   static CSSStyleValueVector CssValueToStyleValueVector(const CSSValue&);
 };
diff --git a/third_party/blink/renderer/core/css/threaded/multi_threaded_test_util.h b/third_party/blink/renderer/core/css/threaded/multi_threaded_test_util.h
index 8d66716d..c97cdc47 100644
--- a/third_party/blink/renderer/core/css/threaded/multi_threaded_test_util.h
+++ b/third_party/blink/renderer/core/css/threaded/multi_threaded_test_util.h
@@ -59,7 +59,7 @@
 
     for (int i = 0; i < num_threads_; ++i) {
       threads.push_back(WebThreadSupportingGC::Create(
-          WebThreadCreationParams(WebThreadType::kTestThread)));
+          ThreadCreationParams(WebThreadType::kTestThread)));
       waits.push_back(std::make_unique<WaitableEvent>());
     }
 
diff --git a/third_party/blink/renderer/core/dom/events/event_listener.h b/third_party/blink/renderer/core/dom/events/event_listener.h
index b5b2c29..d658c3c8 100644
--- a/third_party/blink/renderer/core/dom/events/event_listener.h
+++ b/third_party/blink/renderer/core/dom/events/event_listener.h
@@ -29,7 +29,6 @@
 
 namespace blink {
 
-class DOMWrapperWorld;
 class Event;
 class ExecutionContext;
 
@@ -58,16 +57,6 @@
   }
   virtual bool IsEventHandler() const { return false; }
 
-  // Only DevTools is allowed to use this method.
-  // This method may return an empty handle.
-  virtual v8::Local<v8::Object> GetListenerObjectForInspector(
-      ExecutionContext* execution_context) {
-    return v8::Local<v8::Object>();
-  }
-
-  // Only DevTools is allowed to use this method.
-  virtual DOMWrapperWorld* GetWorldPtrForInspector() const { return nullptr; }
-
   ListenerType GetType() const { return type_; }
 
   // Returns true if this EventListener is implemented based on JS object.
diff --git a/third_party/blink/renderer/core/dom/idle_deadline_test.cc b/third_party/blink/renderer/core/dom/idle_deadline_test.cc
index c0e41360..aebde6e9 100644
--- a/third_party/blink/renderer/core/dom/idle_deadline_test.cc
+++ b/third_party/blink/renderer/core/dom/idle_deadline_test.cc
@@ -27,9 +27,9 @@
   void Shutdown() override {}
   bool ShouldYieldForHighPriorityWork() override { return true; }
   bool CanExceedIdleDeadlineIfRequired() const override { return false; }
-  void PostIdleTask(const base::Location&, WebThread::IdleTask) override {}
+  void PostIdleTask(const base::Location&, Thread::IdleTask) override {}
   void PostNonNestableIdleTask(const base::Location&,
-                               WebThread::IdleTask) override {}
+                               Thread::IdleTask) override {}
   std::unique_ptr<PageScheduler> CreatePageScheduler(
       PageScheduler::Delegate*) override {
     return nullptr;
diff --git a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
index 15243c69..3da0c695 100644
--- a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
+++ b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
@@ -39,11 +39,11 @@
   bool ShouldYieldForHighPriorityWork() override { return should_yield_; }
   bool CanExceedIdleDeadlineIfRequired() const override { return false; }
   void PostIdleTask(const base::Location&,
-                    WebThread::IdleTask idle_task) override {
+                    Thread::IdleTask idle_task) override {
     idle_task_ = std::move(idle_task);
   }
   void PostNonNestableIdleTask(const base::Location&,
-                               WebThread::IdleTask) override {}
+                               Thread::IdleTask) override {}
   std::unique_ptr<PageScheduler> CreatePageScheduler(
       PageScheduler::Delegate*) override {
     return nullptr;
@@ -73,7 +73,7 @@
 
  private:
   bool should_yield_;
-  WebThread::IdleTask idle_task_;
+  Thread::IdleTask idle_task_;
 
   DISALLOW_COPY_AND_ASSIGN(MockScriptedIdleTaskControllerScheduler);
 };
diff --git a/third_party/blink/renderer/core/editing/compute_layer_selection.cc b/third_party/blink/renderer/core/editing/compute_layer_selection.cc
index 4f69de9c..db0e8e7 100644
--- a/third_party/blink/renderer/core/editing/compute_layer_selection.cc
+++ b/third_party/blink/renderer/core/editing/compute_layer_selection.cc
@@ -40,6 +40,7 @@
 #include "third_party/blink/renderer/core/editing/visible_selection.h"
 #include "third_party/blink/renderer/core/editing/visible_units.h"
 #include "third_party/blink/renderer/core/html/forms/text_control_element.h"
+#include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
@@ -120,11 +121,12 @@
 
 static LayoutPoint GetSamplePointForVisibility(
     const LayoutPoint& edge_top_in_layer,
-    const LayoutPoint& edge_bottom_in_layer) {
+    const LayoutPoint& edge_bottom_in_layer,
+    float zoom_factor) {
   FloatSize diff(edge_top_in_layer - edge_bottom_in_layer);
   // Adjust by ~1px to avoid integer snapping error. This logic is the same
   // as that in ComputeViewportSelectionBound in cc.
-  diff.Scale(1 / diff.DiagonalLength());
+  diff.Scale(zoom_factor / diff.DiagonalLength());
   LayoutPoint sample_point = edge_bottom_in_layer;
   sample_point.Move(LayoutSize(diff));
   return sample_point;
@@ -149,7 +151,8 @@
     return true;
 
   const LayoutPoint sample_point =
-      GetSamplePointForVisibility(edge_top_in_layer, edge_bottom_in_layer);
+      GetSamplePointForVisibility(edge_top_in_layer, edge_bottom_in_layer,
+                                  rect_layout_object.View()->ZoomFactor());
 
   LayoutBox* const text_control_object = ToLayoutBox(layout_object);
   const LayoutPoint position_in_input(rect_layout_object.LocalToAncestorPoint(
diff --git a/third_party/blink/renderer/core/editing/compute_layer_selection_test.cc b/third_party/blink/renderer/core/editing/compute_layer_selection_test.cc
index 844f7fc6..59bc1a1f 100644
--- a/third_party/blink/renderer/core/editing/compute_layer_selection_test.cc
+++ b/third_party/blink/renderer/core/editing/compute_layer_selection_test.cc
@@ -314,4 +314,29 @@
   EXPECT_EQ(layer_selection.end.edge_bottom, gfx::Point(8, 28));
 }
 
+// crbug.com/889799. Checking when edge_bottom on box boundary, bound is still
+// visible.
+TEST_F(ComputeLayerSelectionTest, SamplePointOnBoundary) {
+  SetBodyContent(R"HTML(
+      <!DOCTYPE html>
+      <style>
+      input {
+        padding: 0px;
+        border: 0px;
+        font-size: 17px;
+        line-height: 18px;
+      }
+      </style>
+      <input id=target value='test test test test'>
+  )HTML");
+  GetDocument().GetFrame()->SetPageZoomFactor(2.625);
+
+  FocusAndSelectAll(ToHTMLInputElement(GetDocument().getElementById("target")));
+
+  const cc::LayerSelection& composited_selection =
+      ComputeLayerSelection(Selection());
+  EXPECT_FALSE(composited_selection.start.hidden);
+  EXPECT_FALSE(composited_selection.end.hidden);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
index a0169d6..45eae977 100644
--- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
+++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
@@ -59,7 +59,7 @@
       public DevToolsAgent::Client,
       public InspectorPageAgent::Client,
       public InspectorLayerTreeAgent::Client,
-      private WebThread::TaskObserver {
+      private Thread::TaskObserver {
  public:
   class WorkerClient {
    public:
@@ -107,7 +107,7 @@
   // InspectorLayerTreeAgent::Client implementation.
   bool IsInspectorLayer(GraphicsLayer*) override;
 
-  // WebThread::TaskObserver implementation.
+  // Thread::TaskObserver implementation.
   void WillProcessTask() override;
   void DidProcessTask() override;
 
diff --git a/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.cc b/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.cc
index 808341e..5bdf722 100644
--- a/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.cc
+++ b/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.cc
@@ -41,7 +41,7 @@
 }  // namespace
 
 DataConsumerHandleTestUtil::Thread::Thread(
-    const WebThreadCreationParams& params,
+    const ThreadCreationParams& params,
     InitializationPolicy initialization_policy)
     : thread_(WebThreadSupportingGC::Create(params)),
       initialization_policy_(initialization_policy),
diff --git a/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.h b/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.h
index 3ea7418..bd654a3a 100644
--- a/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.h
+++ b/third_party/blink/renderer/core/fetch/data_consumer_handle_test_util.h
@@ -58,7 +58,7 @@
       kWithExecutionContext,
     };
 
-    Thread(const WebThreadCreationParams&,
+    Thread(const ThreadCreationParams&,
            InitializationPolicy = kGarbageCollection);
     ~Thread();
 
@@ -167,10 +167,10 @@
       ThreadHolder(ThreadingTestBase* test)
           : context_(test->context_),
             reading_thread_(std::make_unique<Thread>(
-                WebThreadCreationParams(WebThreadType::kTestThread)
+                ThreadCreationParams(WebThreadType::kTestThread)
                     .SetThreadNameForTest("reading thread"))),
             updating_thread_(std::make_unique<Thread>(
-                WebThreadCreationParams(WebThreadType::kTestThread)
+                ThreadCreationParams(WebThreadType::kTestThread)
                     .SetThreadNameForTest("updating thread"))) {
         context_->RegisterThreadHolder(this);
       }
@@ -401,7 +401,7 @@
 
       Deque<Command> commands_;
       size_t offset_;
-      WebThread* reader_thread_;
+      blink::Thread* reader_thread_;
       Client* client_;
       Result result_;
       bool is_handle_attached_;
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_font_cache.h b/third_party/blink/renderer/core/html/canvas/canvas_font_cache.h
index 8813de5..70f148b 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_font_cache.h
+++ b/third_party/blink/renderer/core/html/canvas/canvas_font_cache.h
@@ -23,7 +23,7 @@
 
 class CORE_EXPORT CanvasFontCache final
     : public GarbageCollectedFinalized<CanvasFontCache>,
-      public WebThread::TaskObserver {
+      public Thread::TaskObserver {
   USING_PRE_FINALIZER(CanvasFontCache, Dispose);
 
  public:
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
index 61fc7bf..322fed1 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
@@ -56,7 +56,7 @@
 constexpr const char* kF16CanvasPixelFormatName = "float16";
 
 class CORE_EXPORT CanvasRenderingContext : public ScriptWrappable,
-                                           public WebThread::TaskObserver {
+                                           public Thread::TaskObserver {
   USING_PRE_FINALIZER(CanvasRenderingContext, Dispose);
 
  public:
@@ -137,7 +137,7 @@
 
   void NeedsFinalizeFrame();
 
-  // WebThread::TaskObserver implementation
+  // Thread::TaskObserver implementation
   void DidProcessTask() override;
   void WillProcessTask() final {}
 
diff --git a/third_party/blink/renderer/core/html/parser/preload_request.cc b/third_party/blink/renderer/core/html/parser/preload_request.cc
index 359310e5..5a4b09f6 100644
--- a/third_party/blink/renderer/core/html/parser/preload_request.cc
+++ b/third_party/blink/renderer/core/html/parser/preload_request.cc
@@ -107,7 +107,7 @@
         params.SetClientLoFiPlaceholder();
       } else if (!is_lazyload_image_disabled_ &&
                  frame->IsLazyLoadingImageAllowed()) {
-        params.SetAllowImagePlaceholder();
+        params.SetLazyImagePlaceholder();
       }
     }
   }
diff --git a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
index 15627db2..2383ed2 100644
--- a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
+++ b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
@@ -53,7 +53,7 @@
     : public GarbageCollectedFinalized<WorkerInspectorController>,
       public TraceEvent::EnabledStateObserver,
       public InspectorSession::Client,
-      private WebThread::TaskObserver {
+      private Thread::TaskObserver {
  public:
   static WorkerInspectorController* Create(WorkerThread*);
   ~WorkerInspectorController() override;
@@ -81,7 +81,7 @@
       const String& message,
       mojom::blink::DevToolsSessionStatePtr updates) override;
 
-  // WebThread::TaskObserver implementation.
+  // Thread::TaskObserver implementation.
   void WillProcessTask() override;
   void DidProcessTask() override;
 
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc
index 9b16742..7f510351 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -4472,9 +4472,8 @@
 DISABLE_CFI_PERF
 bool LayoutBlockFlow::CreatesNewFormattingContext() const {
   if (IsInline() || IsFloatingOrOutOfFlowPositioned() || HasOverflowClip() ||
-      IsFlexItemIncludingDeprecated() || IsTableCell() || IsTableCaption() ||
-      IsFieldsetIncludingNG() || IsCustomItem() || IsDocumentElement() ||
-      IsGridItem() || IsWritingModeRoot() ||
+      IsFlexItemIncludingDeprecated() || IsCustomItem() ||
+      IsDocumentElement() || IsGridItem() || IsWritingModeRoot() ||
       StyleRef().Display() == EDisplay::kFlowRoot ||
       ShouldApplyPaintContainment() || ShouldApplyLayoutContainment() ||
       StyleRef().SpecifiesColumns() ||
@@ -4483,40 +4482,9 @@
     return true;
   }
 
-  // The remaining checks here are not covered by any spec, but we still need to
-  // establish new formatting contexts in some cases, for various reasons.
-
-  if (IsRubyText()) {
-    // Ruby text objects are pushed around after layout, to become flush with
-    // the associated ruby base. As such, we cannot let floats leak out from
-    // ruby text objects.
-    return true;
-  }
-
-  if (IsLayoutFlowThread()) {
-    // The spec requires multicol containers to establish new formatting
-    // contexts. Blink uses an anonymous flow thread child of the multicol
-    // container to actually perform layout inside. Therefore we need to
-    // propagate the BFCness down to the flow thread, so that floats are fully
-    // contained by the flow thread, and thereby the multicol container.
-    return true;
-  }
-
   if (IsRenderedLegend())
     return true;
 
-  if (IsTextControl()) {
-    // INPUT and other replaced elements rendered by Blink itself should be
-    // completely contained.
-    return true;
-  }
-
-  if (IsSVGForeignObject()) {
-    // This is the root of a foreign object. Don't let anything inside it escape
-    // to our ancestors.
-    return true;
-  }
-
   return false;
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_fieldset.h b/third_party/blink/renderer/core/layout/layout_fieldset.h
index f0218778..af5bfad 100644
--- a/third_party/blink/renderer/core/layout/layout_fieldset.h
+++ b/third_party/blink/renderer/core/layout/layout_fieldset.h
@@ -37,6 +37,8 @@
 
   const char* GetName() const override { return "LayoutFieldset"; }
 
+  bool CreatesNewFormattingContext() const final { return true; }
+
  private:
   bool IsOfType(LayoutObjectType type) const override {
     return type == kLayoutObjectFieldset || LayoutBlockFlow::IsOfType(type);
diff --git a/third_party/blink/renderer/core/layout/layout_flow_thread.h b/third_party/blink/renderer/core/layout/layout_flow_thread.h
index 08d9403..352b586 100644
--- a/third_party/blink/renderer/core/layout/layout_flow_thread.h
+++ b/third_party/blink/renderer/core/layout/layout_flow_thread.h
@@ -71,6 +71,15 @@
   virtual bool IsLayoutMultiColumnFlowThread() const { return false; }
   virtual bool IsLayoutPagedFlowThread() const { return false; }
 
+  bool CreatesNewFormattingContext() const final {
+    // The spec requires multicol containers to establish new formatting
+    // contexts. Blink uses an anonymous flow thread child of the multicol
+    // container to actually perform layout inside. Therefore we need to
+    // propagate the BFCness down to the flow thread, so that floats are fully
+    // contained by the flow thread, and thereby the multicol container.
+    return true;
+  }
+
   // Search mode when looking for an enclosing fragmentation context.
   enum AncestorSearchConstraint {
     // No constraints. When we're not laying out (but rather e.g. painting or
diff --git a/third_party/blink/renderer/core/layout/layout_ruby_text.h b/third_party/blink/renderer/core/layout/layout_ruby_text.h
index acb6e2d..b2e1ced 100644
--- a/third_party/blink/renderer/core/layout/layout_ruby_text.h
+++ b/third_party/blink/renderer/core/layout/layout_ruby_text.h
@@ -48,6 +48,13 @@
 
   bool IsChildAllowed(LayoutObject*, const ComputedStyle&) const override;
 
+  bool CreatesNewFormattingContext() const final {
+    // Ruby text objects are pushed around after layout, to become flush with
+    // the associated ruby base. As such, we cannot let floats leak out from
+    // ruby text objects.
+    return true;
+  }
+
  private:
   ETextAlign TextAlignmentForLine(bool ends_with_soft_break) const override;
   void AdjustInlineDirectionLineBounds(
diff --git a/third_party/blink/renderer/core/layout/layout_table_caption.h b/third_party/blink/renderer/core/layout/layout_table_caption.h
index 044f88b..240de49b 100644
--- a/third_party/blink/renderer/core/layout/layout_table_caption.h
+++ b/third_party/blink/renderer/core/layout/layout_table_caption.h
@@ -49,6 +49,8 @@
   LayoutUnit ContainingBlockLogicalWidthForContent() const override;
 
  protected:
+  bool CreatesNewFormattingContext() const final { return true; }
+
   bool IsOfType(LayoutObjectType type) const override {
     return type == kLayoutObjectTableCaption || LayoutBlockFlow::IsOfType(type);
   }
diff --git a/third_party/blink/renderer/core/layout/layout_table_cell.h b/third_party/blink/renderer/core/layout/layout_table_cell.h
index e369526c..cd8500c 100644
--- a/third_party/blink/renderer/core/layout/layout_table_cell.h
+++ b/third_party/blink/renderer/core/layout/layout_table_cell.h
@@ -361,6 +361,8 @@
       const LayoutObject*,
       bool ignore_scroll_offset) const override;
 
+  bool CreatesNewFormattingContext() const final { return true; }
+
  protected:
   bool IsOfType(LayoutObjectType type) const override {
     return type == kLayoutObjectTableCell || LayoutBlockFlow::IsOfType(type);
diff --git a/third_party/blink/renderer/core/layout/layout_text_control.h b/third_party/blink/renderer/core/layout/layout_text_control.h
index 43aed74..b4be797e 100644
--- a/third_party/blink/renderer/core/layout/layout_text_control.h
+++ b/third_party/blink/renderer/core/layout/layout_text_control.h
@@ -39,6 +39,12 @@
   TextControlElement* GetTextControlElement() const;
   const char* GetName() const override { return "LayoutTextControl"; }
 
+  bool CreatesNewFormattingContext() const final {
+    // INPUT and other replaced elements rendered by Blink itself should be
+    // completely contained.
+    return true;
+  }
+
  protected:
   LayoutTextControl(TextControlElement*);
 
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.h b/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.h
index e549fc8..b412c6c 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.h
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.h
@@ -19,6 +19,8 @@
   void AddChild(LayoutObject* new_child,
                 LayoutObject* before_child = nullptr) override;
 
+  bool CreatesNewFormattingContext() const final { return true; }
+
  protected:
   bool IsOfType(LayoutObjectType) const override;
 };
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.h b/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.h
index c302e8f..7fdaa7c 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.h
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.h
@@ -83,6 +83,12 @@
 
   PaintLayerType LayerTypeRequired() const override;
 
+  bool CreatesNewFormattingContext() const final {
+    // This is the root of a foreign object. Don't let anything inside it escape
+    // to our ancestors.
+    return true;
+  }
+
  private:
   LayoutUnit ElementX() const;
   LayoutUnit ElementY() const;
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
index 459becd..d109d3a5 100644
--- a/third_party/blink/renderer/core/loader/image_loader.cc
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -496,7 +496,7 @@
         params.SetClientLoFiPlaceholder();
       } else if (auto* html_image = ToHTMLImageElementOrNull(GetElement())) {
         if (IsLazyLoadingImageAllowed(frame, html_image)) {
-          params.SetAllowImagePlaceholder();
+          params.SetLazyImagePlaceholder();
           lazy_image_load_state_ = LazyImageLoadState::kDeferred;
         }
         LazyLoadImageObserver::StartTrackingVisibilityMetrics(html_image);
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource.cc b/third_party/blink/renderer/core/loader/resource/image_resource.cc
index 40066027..fc163ab88 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource.cc
@@ -96,6 +96,9 @@
   bool ShouldShowPlaceholder() const override {
     return resource_->ShouldShowPlaceholder();
   }
+  bool ShouldShowLazyImagePlaceholder() const override {
+    return resource_->ShouldShowLazyImagePlaceholder();
+  }
   bool IsCacheValidator() const override {
     return resource_->IsCacheValidator();
   }
@@ -551,6 +554,21 @@
   return false;
 }
 
+bool ImageResource::ShouldShowLazyImagePlaceholder() const {
+  switch (placeholder_option_) {
+    case PlaceholderOption::kShowAndReloadPlaceholderAlways:
+    case PlaceholderOption::kShowAndDoNotReloadPlaceholder:
+      return RuntimeEnabledFeatures::LazyImageLoadingEnabled() &&
+             (GetResourceRequest().GetPreviewsState() &
+              WebURLRequest::kLazyImageLoadDeferred);
+    case PlaceholderOption::kReloadPlaceholderOnDecodeError:
+    case PlaceholderOption::kDoNotReloadPlaceholder:
+      return false;
+  }
+  NOTREACHED();
+  return false;
+}
+
 bool ImageResource::ShouldReloadBrokenPlaceholder() const {
   switch (placeholder_option_) {
     case PlaceholderOption::kShowAndReloadPlaceholderAlways:
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource.h b/third_party/blink/renderer/core/loader/resource/image_resource.h
index e1c3abe..572ecac 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource.h
+++ b/third_party/blink/renderer/core/loader/resource/image_resource.h
@@ -99,6 +99,7 @@
   void MultipartDataReceived(const char*, size_t) final;
 
   bool ShouldShowPlaceholder() const;
+  bool ShouldShowLazyImagePlaceholder() const;
 
   // If the ImageResource came from a user agent CSS stylesheet then we should
   // flag it so that it can persist beyond navigation.
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
index da2c367..f3553d59 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
@@ -43,6 +43,7 @@
   bool IsSchedulingReload() const override { return false; }
   const ResourceResponse& GetResponse() const override { return response_; }
   bool ShouldShowPlaceholder() const override { return false; }
+  bool ShouldShowLazyImagePlaceholder() const override { return false; }
   bool IsCacheValidator() const override { return false; }
   bool SchedulingReloadOrShouldReloadBrokenPlaceholder() const override {
     return false;
@@ -430,13 +431,19 @@
       if (size_available_ == Image::kSizeUnavailable && !all_data_received)
         return UpdateImageResult::kNoDecodeError;
 
-      if (info_->ShouldShowPlaceholder() && all_data_received) {
+      if ((info_->ShouldShowPlaceholder() ||
+           info_->ShouldShowLazyImagePlaceholder()) &&
+          all_data_received) {
         if (image_ && !image_->IsNull()) {
           IntSize dimensions = image_->Size();
           ClearImage();
-          image_ = PlaceholderImage::Create(
-              this, dimensions,
-              EstimateOriginalImageSizeForPlaceholder(info_->GetResponse()));
+          if (info_->ShouldShowLazyImagePlaceholder()) {
+            image_ = PlaceholderImage::CreateForLazyImages(this, dimensions);
+          } else {
+            image_ = PlaceholderImage::Create(
+                this, dimensions,
+                EstimateOriginalImageSizeForPlaceholder(info_->GetResponse()));
+          }
         }
       }
 
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_info.h b/third_party/blink/renderer/core/loader/resource/image_resource_info.h
index ab395091..c26177b 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_info.h
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_info.h
@@ -33,6 +33,7 @@
   virtual bool IsSchedulingReload() const = 0;
   virtual const ResourceResponse& GetResponse() const = 0;
   virtual bool ShouldShowPlaceholder() const = 0;
+  virtual bool ShouldShowLazyImagePlaceholder() const = 0;
   virtual bool IsCacheValidator() const = 0;
   virtual bool SchedulingReloadOrShouldReloadBrokenPlaceholder() const = 0;
   enum DoesCurrentFrameHaveSingleSecurityOrigin {
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_test.cc b/third_party/blink/renderer/core/workers/dedicated_worker_test.cc
index bfe1fdb..a833d26c 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_test.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_test.cc
@@ -35,7 +35,7 @@
                               nullptr /* parent_execution_context*/,
                               worker_object_proxy) {
     worker_backing_thread_ = WorkerBackingThread::Create(
-        WebThreadCreationParams(WebThreadType::kTestThread));
+        ThreadCreationParams(WebThreadType::kTestThread));
   }
 
   WorkerOrWorkletGlobalScope* CreateWorkerGlobalScope(
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc b/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc
index b081cbf0..4bd6088 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc
@@ -64,7 +64,7 @@
       parent_execution_context ? parent_execution_context->GetScheduler()
                                : nullptr;
   worker_backing_thread_ =
-      WorkerBackingThread::Create(WebThreadCreationParams(GetThreadType())
+      WorkerBackingThread::Create(ThreadCreationParams(GetThreadType())
                                       .SetFrameOrWorkerScheduler(scheduler));
 }
 
diff --git a/third_party/blink/renderer/core/workers/experimental/thread_pool.cc b/third_party/blink/renderer/core/workers/experimental/thread_pool.cc
index b66b509..fd79626 100644
--- a/third_party/blink/renderer/core/workers/experimental/thread_pool.cc
+++ b/third_party/blink/renderer/core/workers/experimental/thread_pool.cc
@@ -107,7 +107,7 @@
       parent_execution_context ? parent_execution_context->GetScheduler()
                                : nullptr;
   worker_backing_thread_ =
-      WorkerBackingThread::Create(WebThreadCreationParams(GetThreadType())
+      WorkerBackingThread::Create(ThreadCreationParams(GetThreadType())
                                       .SetFrameOrWorkerScheduler(scheduler));
 }
 
diff --git a/third_party/blink/renderer/core/workers/shared_worker_thread.cc b/third_party/blink/renderer/core/workers/shared_worker_thread.cc
index f11d6d2b..a5c62bfc 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_thread.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_thread.cc
@@ -41,8 +41,8 @@
     const String& name,
     WorkerReportingProxy& worker_reporting_proxy)
     : WorkerThread(worker_reporting_proxy),
-      worker_backing_thread_(WorkerBackingThread::Create(
-          WebThreadCreationParams(GetThreadType()))),
+      worker_backing_thread_(
+          WorkerBackingThread::Create(ThreadCreationParams(GetThreadType()))),
       name_(name.IsolatedCopy()) {}
 
 SharedWorkerThread::~SharedWorkerThread() = default;
diff --git a/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.cc b/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.cc
index 6a8802e..8be178d 100644
--- a/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.cc
+++ b/third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.cc
@@ -63,7 +63,10 @@
           OriginTrialContext::GetTokens(document).get(),
           base::UnguessableToken::Create(),
           std::make_unique<WorkerSettings>(document->GetSettings()),
-          kV8CacheOptionsDefault, module_responses_map);
+          kV8CacheOptionsDefault, module_responses_map,
+          service_manager::mojom::blink::InterfaceProviderPtrInfo(),
+          BeginFrameProviderParams(), nullptr /* parent_feature_policy */,
+          document->GetAgentClusterID());
 
   // Worklets share the pre-initialized backing thread so that we don't have to
   // specify the backing thread startup data.
diff --git a/third_party/blink/renderer/core/workers/threaded_worklet_test.cc b/third_party/blink/renderer/core/workers/threaded_worklet_test.cc
index e2d7086..abb4481 100644
--- a/third_party/blink/renderer/core/workers/threaded_worklet_test.cc
+++ b/third_party/blink/renderer/core/workers/threaded_worklet_test.cc
@@ -73,7 +73,7 @@
   static void EnsureSharedBackingThread() {
     DCHECK(IsMainThread());
     WorkletThreadHolder<ThreadedWorkletThreadForTest>::EnsureInstance(
-        WebThreadCreationParams(WebThreadType::kTestThread)
+        ThreadCreationParams(WebThreadType::kTestThread)
             .SetThreadNameForTest("ThreadedWorkletThreadForTest"));
   }
 
diff --git a/third_party/blink/renderer/core/workers/worker_backing_thread.cc b/third_party/blink/renderer/core/workers/worker_backing_thread.cc
index f1a1bbf..5a3c9935 100644
--- a/third_party/blink/renderer/core/workers/worker_backing_thread.cc
+++ b/third_party/blink/renderer/core/workers/worker_backing_thread.cc
@@ -60,7 +60,7 @@
   WorkerBackingThread::SetRAILModeOnWorkerThreadIsolates(rail_mode);
 }
 
-WorkerBackingThread::WorkerBackingThread(const WebThreadCreationParams& params)
+WorkerBackingThread::WorkerBackingThread(const ThreadCreationParams& params)
     : backing_thread_(WebThreadSupportingGC::Create(params)) {}
 
 WorkerBackingThread::~WorkerBackingThread() = default;
diff --git a/third_party/blink/renderer/core/workers/worker_backing_thread.h b/third_party/blink/renderer/core/workers/worker_backing_thread.h
index f1270f6..a84b5ba 100644
--- a/third_party/blink/renderer/core/workers/worker_backing_thread.h
+++ b/third_party/blink/renderer/core/workers/worker_backing_thread.h
@@ -27,7 +27,7 @@
 class CORE_EXPORT WorkerBackingThread final {
  public:
   static std::unique_ptr<WorkerBackingThread> Create(
-      const WebThreadCreationParams& params) {
+      const ThreadCreationParams& params) {
     return base::WrapUnique(new WorkerBackingThread(params));
   }
 
@@ -53,7 +53,7 @@
   static void SetRAILModeOnWorkerThreadIsolates(v8::RAILMode);
 
  private:
-  explicit WorkerBackingThread(const WebThreadCreationParams&);
+  explicit WorkerBackingThread(const ThreadCreationParams&);
 
   std::unique_ptr<WebThreadSupportingGC> backing_thread_;
   v8::Isolate* isolate_ = nullptr;
diff --git a/third_party/blink/renderer/core/workers/worker_thread.h b/third_party/blink/renderer/core/workers/worker_thread.h
index 30306139..36e19742 100644
--- a/third_party/blink/renderer/core/workers/worker_thread.h
+++ b/third_party/blink/renderer/core/workers/worker_thread.h
@@ -78,7 +78,7 @@
 //    If the running task is for debugger, it's guaranteed to finish without
 //    any interruptions.
 //  - Queued tasks never run.
-class CORE_EXPORT WorkerThread : public WebThread::TaskObserver {
+class CORE_EXPORT WorkerThread : public Thread::TaskObserver {
  public:
   // Represents how this thread is terminated. Used for UMA. Append only.
   enum class ExitCode {
@@ -139,7 +139,7 @@
   // WARNING: This is not safe if a nested worker is running.
   static void TerminateAllWorkersForTesting();
 
-  // WebThread::TaskObserver.
+  // Thread::TaskObserver.
   void WillProcessTask() override;
   void DidProcessTask() override;
 
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
index 0341251..b7a8348 100644
--- a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
+++ b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
@@ -73,7 +73,7 @@
       WorkerReportingProxy& mock_worker_reporting_proxy)
       : WorkerThread(mock_worker_reporting_proxy),
         worker_backing_thread_(WorkerBackingThread::Create(
-            WebThreadCreationParams(WebThreadType::kTestThread))) {}
+            ThreadCreationParams(WebThreadType::kTestThread))) {}
 
   ~WorkerThreadForTest() override = default;
 
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
index 548fd9d..aea0f978 100644
--- a/third_party/blink/renderer/core/workers/worklet_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
@@ -39,7 +39,10 @@
       document_secure_context_(creation_params->starter_secure_context),
       module_responses_map_(creation_params->module_responses_map),
       // Step 4. "Let inheritedHTTPSState be outsideSettings's HTTPS state."
-      https_state_(creation_params->starter_https_state) {
+      https_state_(creation_params->starter_https_state),
+      agent_cluster_id_(creation_params->agent_cluster_id.is_empty()
+                            ? base::UnguessableToken::Create()
+                            : creation_params->agent_cluster_id) {
   // Step 2: "Let inheritedAPIBaseURL be outsideSettings's API base URL."
   // |url_| is the inheritedAPIBaseURL passed from the parent Document.
 
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.h b/third_party/blink/renderer/core/workers/worklet_global_scope.h
index 9588fba..bc94455 100644
--- a/third_party/blink/renderer/core/workers/worklet_global_scope.h
+++ b/third_party/blink/renderer/core/workers/worklet_global_scope.h
@@ -50,11 +50,16 @@
   String UserAgent() const final { return user_agent_; }
   SecurityContext& GetSecurityContext() final { return *this; }
   bool IsSecureContext(String& error_message) const final;
-
-  // Currently, worklet agents have no clearly defined owner. See
-  // https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism
   const base::UnguessableToken& GetAgentClusterID() const final {
-    return base::UnguessableToken::Null();
+    // Currently, worklet agents have no clearly defined owner. See
+    // https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism
+    //
+    // However, it is intended that a SharedArrayBuffer can be shared with a
+    // worklet, e.g. the AudioWorklet. If this WorkletGlobalScope's creation
+    // params included an agent cluster ID, we'll assume that this worklet is
+    // in the same agent cluster. See
+    // https://bugs.chromium.org/p/chromium/issues/detail?id=892067.
+    return agent_cluster_id_;
   }
 
   DOMTimerCoordinator* Timers() final {
@@ -123,6 +128,8 @@
   CrossThreadPersistent<WorkletModuleResponsesMap> module_responses_map_;
 
   const HttpsState https_state_;
+
+  const base::UnguessableToken agent_cluster_id_;
 };
 
 DEFINE_TYPE_CASTS(WorkletGlobalScope,
diff --git a/third_party/blink/renderer/core/workers/worklet_thread_holder.h b/third_party/blink/renderer/core/workers/worklet_thread_holder.h
index f296058..2a18f37c 100644
--- a/third_party/blink/renderer/core/workers/worklet_thread_holder.h
+++ b/third_party/blink/renderer/core/workers/worklet_thread_holder.h
@@ -24,7 +24,7 @@
     return thread_holder_instance_;
   }
 
-  static void EnsureInstance(const WebThreadCreationParams& params) {
+  static void EnsureInstance(const ThreadCreationParams& params) {
     DCHECK(IsMainThread());
     MutexLocker locker(HolderInstanceMutex());
     if (thread_holder_instance_)
diff --git a/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png b/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png
index 4dcaa26..b5121c3 100644
--- a/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png
+++ b/third_party/blink/renderer/devtools/front_end/Images/whatsnew.png
Binary files differ
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js b/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js
index cad5a0b8..b87524016 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/Audits2ReportRenderer.js
@@ -16,7 +16,7 @@
 
     const defaultPassTrace = artifacts.traces.defaultPass;
     const timelineButton = UI.createTextButton(Common.UIString('View Trace'), onViewTraceClick, 'view-trace');
-    el.querySelector('.lh-metric-column').appendChild(timelineButton);
+    el.querySelector('.lh-column').appendChild(timelineButton);
     return el;
 
     async function onViewTraceClick() {
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js
index 4daf750..973526c5 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/category-renderer.js
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2017 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 'use strict';
 
@@ -75,10 +86,10 @@
     if (audit.result.scoreDisplayMode === 'error') {
       auditEl.classList.add(`lh-audit--error`);
       const textEl = this.dom.find('.lh-audit__display-text', auditEl);
-      textEl.textContent = 'Error!';
+      textEl.textContent = Util.UIStrings.errorLabel;
       textEl.classList.add('tooltip-boundary');
       const tooltip = this.dom.createChildOf(textEl, 'div', 'tooltip tooltip--error');
-      tooltip.textContent = audit.result.errorMessage || 'Report error: no audit information';
+      tooltip.textContent = audit.result.errorMessage || Util.UIStrings.errorMissingAuditInfo;
     } else if (audit.result.explanation) {
       const explEl = this.dom.createChildOf(titleEl, 'div', 'lh-audit-explanation');
       explEl.textContent = audit.result.explanation;
@@ -89,9 +100,9 @@
     // Add list of warnings or singular warning
     const warningsEl = this.dom.createChildOf(titleEl, 'div', 'lh-warnings');
     if (warnings.length === 1) {
-      warningsEl.textContent = `Warning: ${warnings.join('')}`;
+      warningsEl.textContent = `${Util.UIStrings.warningHeader} ${warnings.join('')}`;
     } else {
-      warningsEl.textContent = 'Warnings: ';
+      warningsEl.textContent = Util.UIStrings.warningHeader;
       const warningsUl = this.dom.createChildOf(warningsEl, 'ul');
       for (const warning of warnings) {
         const item = this.dom.createChildOf(warningsUl, 'li');
@@ -158,7 +169,7 @@
     const itemCountEl = this.dom.createChildOf(summmaryEl, 'div', 'lh-audit-group__itemcount');
     if (expandable) {
       const chevronEl = summmaryEl.appendChild(this._createChevron());
-      chevronEl.title = 'Show audits';
+      chevronEl.title = Util.UIStrings.auditGroupExpandTooltip;
     }
 
     if (group.description) {
@@ -169,6 +180,7 @@
     headerEl.textContent = group.title;
 
     if (opts.itemCount) {
+      // TODO(i18n): support multiple locales here
       itemCountEl.textContent = `${opts.itemCount} audits`;
     }
     return groupEl;
@@ -211,7 +223,7 @@
    */
   renderPassedAuditsSection(elements) {
     const passedElem = this.renderAuditGroup({
-      title: `Passed audits`,
+      title: Util.UIStrings.passedAuditsGroupTitle,
     }, {expandable: true, itemCount: this._getTotalAuditsLength(elements)});
     passedElem.classList.add('lh-passed-audits');
     elements.forEach(elem => passedElem.appendChild(elem));
@@ -224,7 +236,7 @@
    */
   _renderNotApplicableAuditsSection(elements) {
     const notApplicableElem = this.renderAuditGroup({
-      title: `Not applicable`,
+      title: Util.UIStrings.notApplicableAuditsGroupTitle,
     }, {expandable: true, itemCount: this._getTotalAuditsLength(elements)});
     notApplicableElem.classList.add('lh-audit-group--not-applicable');
     elements.forEach(elem => notApplicableElem.appendChild(elem));
@@ -237,7 +249,7 @@
    * @return {Element}
    */
   _renderManualAudits(manualAudits, manualDescription) {
-    const group = {title: 'Additional items to manually check', description: manualDescription};
+    const group = {title: Util.UIStrings.manualAuditsGroupTitle, description: manualDescription};
     const auditGroupElem = this.renderAuditGroup(group,
         {expandable: true, itemCount: manualAudits.length});
     auditGroupElem.classList.add('lh-audit-group--manual');
@@ -282,7 +294,7 @@
     percentageEl.textContent = scoreOutOf100.toString();
     if (category.score === null) {
       percentageEl.textContent = '?';
-      percentageEl.title = 'Errors occurred while auditing';
+      percentageEl.title = Util.UIStrings.errorLabel;
     }
 
     this.dom.find('.lh-gauge__label', tmpl).textContent = category.title;
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/crc-details-renderer.js b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/crc-details-renderer.js
index 5c5fe795..0ab3741 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/crc-details-renderer.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/crc-details-renderer.js
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2017 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 'use strict';
 
@@ -115,11 +126,11 @@
     dom.find('.crc-node__tree-hostname', treevalEl).textContent = hostname ? `(${hostname})` : '';
 
     if (!segment.hasChildren) {
+      const {startTime, endTime, transferSize} = segment.node.request;
       const span = dom.createElement('span', 'crc-node__chain-duration');
-      span.textContent = ' - ' + Util.chainDuration(
-          segment.node.request.startTime, segment.node.request.endTime) + 'ms, ';
+      span.textContent = ' - ' + Util.formatMilliseconds((endTime - startTime) * 1000) + ', ';
       const span2 = dom.createElement('span', 'crc-node__chain-duration');
-      span2.textContent = Util.formatBytesToKB(segment.node.request.transferSize, 0.01);
+      span2.textContent = Util.formatBytesToKB(transferSize, 0.01);
 
       treevalEl.appendChild(span);
       treevalEl.appendChild(span2);
@@ -157,11 +168,11 @@
     const containerEl = dom.find('.lh-crc', tmpl);
 
     // Fill in top summary.
+    dom.find('.crc-initial-nav', tmpl).textContent = Util.UIStrings.crcInitialNavigation;
+    dom.find('.lh-crc__longest_duration_label', tmpl).textContent =
+        Util.UIStrings.crcLongestDurationLabel;
     dom.find('.lh-crc__longest_duration', tmpl).textContent =
-        Util.formatNumber(details.longestChain.duration) + 'ms';
-    dom.find('.lh-crc__longest_length', tmpl).textContent = details.longestChain.length.toString();
-    dom.find('.lh-crc__longest_transfersize', tmpl).textContent =
-        Util.formatBytesToKB(details.longestChain.transferSize);
+        Util.formatMilliseconds(details.longestChain.duration);
 
     // Construct visual tree.
     const root = CriticalRequestChainRenderer.initTree(details.chains);
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/details-renderer.js b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/details-renderer.js
index 9f48a3e..a5cf44b3 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/details-renderer.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/details-renderer.js
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2017 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 'use strict';
 
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/dom.js b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/dom.js
index 69ce25b..fa1d564 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/dom.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/dom.js
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2017 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 'use strict';
 
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/performance-category-renderer.js b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/performance-category-renderer.js
index 3b25314..873c0b76 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/performance-category-renderer.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/performance-category-renderer.js
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2018 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2018 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 'use strict';
 
@@ -101,24 +112,31 @@
   /**
    * @param {LH.ReportResult.Category} category
    * @param {Object<string, LH.Result.ReportGroup>} groups
+   * @param {'PSI'=} environment 'PSI' and undefined are the only valid values
    * @return {Element}
    * @override
    */
-  render(category, groups) {
+  render(category, groups, environment) {
     const element = this.dom.createElement('div', 'lh-category');
-    this.createPermalinkSpan(element, category.id);
-    element.appendChild(this.renderCategoryHeader(category));
+    if (environment === 'PSI') {
+      const gaugeEl = this.dom.createElement('div', 'lh-score__gauge');
+      gaugeEl.appendChild(this.renderScoreGauge(category));
+      element.appendChild(gaugeEl);
+    } else {
+      this.createPermalinkSpan(element, category.id);
+      element.appendChild(this.renderCategoryHeader(category));
+    }
 
     // Metrics
     const metricAudits = category.auditRefs.filter(audit => audit.group === 'metrics');
-    const metricAuditsEl = this.renderAuditGroup(groups['metrics'], {expandable: false});
+    const metricAuditsEl = this.renderAuditGroup(groups.metrics, {expandable: false});
 
     const keyMetrics = metricAudits.filter(a => a.weight >= 3);
     const otherMetrics = metricAudits.filter(a => a.weight < 3);
 
-    const metricsBoxesEl = this.dom.createChildOf(metricAuditsEl, 'div', 'lh-metric-container');
-    const metricsColumn1El = this.dom.createChildOf(metricsBoxesEl, 'div', 'lh-metric-column');
-    const metricsColumn2El = this.dom.createChildOf(metricsBoxesEl, 'div', 'lh-metric-column');
+    const metricsBoxesEl = this.dom.createChildOf(metricAuditsEl, 'div', 'lh-columns');
+    const metricsColumn1El = this.dom.createChildOf(metricsBoxesEl, 'div', 'lh-column');
+    const metricsColumn2El = this.dom.createChildOf(metricsBoxesEl, 'div', 'lh-column');
 
     keyMetrics.forEach(item => {
       metricsColumn1El.appendChild(this._renderMetric(item));
@@ -126,9 +144,13 @@
     otherMetrics.forEach(item => {
       metricsColumn2El.appendChild(this._renderMetric(item));
     });
-    const estValuesEl = this.dom.createChildOf(metricsColumn2El, 'div',
-        'lh-metrics__disclaimer lh-metrics__disclaimer');
-    estValuesEl.textContent = 'Values are estimated and may vary.';
+
+    // 'Values are estimated and may vary' is used as the category description for PSI
+    if (environment !== 'PSI') {
+      const estValuesEl = this.dom.createChildOf(metricsColumn2El, 'div',
+          'lh-metrics__disclaimer lh-metrics__disclaimer');
+      estValuesEl.textContent = Util.UIStrings.varianceDisclaimer;
+    }
 
     metricAuditsEl.classList.add('lh-audit-group--metrics');
     element.appendChild(metricAuditsEl);
@@ -156,6 +178,12 @@
       const scale = Math.max(Math.ceil(maxWaste / 1000) * 1000, minimumScale);
       const groupEl = this.renderAuditGroup(groups['load-opportunities'], {expandable: false});
       const tmpl = this.dom.cloneTemplate('#tmpl-lh-opportunity-header', this.templateContext);
+
+      this.dom.find('.lh-load-opportunity__col--one', tmpl).textContent =
+        Util.UIStrings.opportunityResourceColumnLabel;
+      this.dom.find('.lh-load-opportunity__col--two', tmpl).textContent =
+        Util.UIStrings.opportunitySavingsColumnLabel;
+
       const headerEl = this.dom.find('.lh-load-opportunity__header', tmpl);
       groupEl.appendChild(headerEl);
       opportunityAudits.forEach((item, i) =>
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/report-renderer.js b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/report-renderer.js
index de990d2..23e772fb 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/report-renderer.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/report-renderer.js
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2017 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 'use strict';
 
@@ -29,20 +40,21 @@
   }
 
   /**
-   * @param {LH.ReportResult} report
+   * @param {LH.Result} result
    * @param {Element} container Parent element to render the report into.
    */
-  renderReport(report, container) {
-    // If any mutations happen to the report within the renderers, we want the original object untouched
-    const clone = /** @type {LH.ReportResult} */ (JSON.parse(JSON.stringify(report)));
+  renderReport(result, container) {
+    // Mutate the UIStrings if necessary (while saving originals)
+    const originalUIStrings = JSON.parse(JSON.stringify(Util.UIStrings));
 
-    // TODO(phulce): we all agree this is technical debt we should fix
-    if (typeof clone.categories !== 'object') throw new Error('No categories provided.');
-    clone.reportCategories = Object.values(clone.categories);
-    ReportRenderer.smooshAuditResultsIntoCategories(clone.audits, clone.reportCategories);
+    const report = Util.prepareReportResult(result);
 
     container.textContent = ''; // Remove previous report.
-    container.appendChild(this._renderReport(clone));
+    container.appendChild(this._renderReport(report));
+
+    // put the UIStrings back into original state
+    Util.updateAllUIStrings(originalUIStrings);
+
     return /** @type {Element} **/ (container);
   }
 
@@ -103,8 +115,14 @@
       {name: 'URL', description: report.finalUrl},
       {name: 'Fetch time', description: Util.formatDateTime(report.fetchTime)},
       ...envValues,
-      {name: 'User agent', description: report.userAgent},
+      {name: 'User agent (host)', description: report.userAgent},
+      {name: 'User agent (network)', description: report.environment &&
+        report.environment.networkUserAgent},
+      {name: 'CPU/Memory Power', description: report.environment &&
+        report.environment.benchmarkIndex.toFixed(0)},
     ].forEach(runtime => {
+      if (!runtime.description) return;
+
       const item = this._dom.cloneTemplate('#tmpl-lh-env__items', env);
       this._dom.find('.lh-env__name', item).textContent = `${runtime.name}:`;
       this._dom.find('.lh-env__description', item).textContent = runtime.description;
@@ -126,6 +144,9 @@
     }
 
     const container = this._dom.cloneTemplate('#tmpl-lh-warnings--toplevel', this._templateContext);
+    const message = this._dom.find('.lh-warnings__msg', container);
+    message.textContent = Util.UIStrings.toplevelWarningsMessage;
+
     const warnings = this._dom.find('ul', container);
     for (const warningString of report.runWarnings) {
       const warning = warnings.appendChild(this._dom.createElement('li'));
@@ -150,7 +171,6 @@
       header = this._renderReportHeader(report);
     }
     headerContainer.appendChild(header);
-    const scoresContainer = this._dom.find('.lh-scores-container', headerContainer);
 
     const container = this._dom.createElement('div', 'lh-container');
     const reportSection = container.appendChild(this._dom.createElement('div', 'lh-report'));
@@ -187,6 +207,9 @@
 
     if (scoreHeader) {
       const scoreScale = this._dom.cloneTemplate('#tmpl-lh-scorescale', this._templateContext);
+      this._dom.find('.lh-scorescale-label', scoreScale).textContent =
+        Util.UIStrings.scorescaleLabel;
+      const scoresContainer = this._dom.find('.lh-scores-container', headerContainer);
       scoresContainer.appendChild(scoreHeader);
       scoresContainer.appendChild(scoreScale);
     }
@@ -199,22 +222,11 @@
 
     return reportFragment;
   }
-
-  /**
-   * Place the AuditResult into the auditDfn (which has just weight & group)
-   * @param {Object<string, LH.Audit.Result>} audits
-   * @param {Array<LH.ReportResult.Category>} reportCategories
-   */
-  static smooshAuditResultsIntoCategories(audits, reportCategories) {
-    for (const category of reportCategories) {
-      category.auditRefs.forEach(auditMeta => {
-        const result = audits[auditMeta.id];
-        auditMeta.result = result;
-      });
-    }
-  }
 }
 
+/** @type {LH.I18NRendererStrings} */
+ReportRenderer._UIStringsStash = {};
+
 if (typeof module !== 'undefined' && module.exports) {
   module.exports = ReportRenderer;
 } else {
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/util.js b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/util.js
index 87fc3a73..2b1996a 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/util.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/renderer/util.js
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2017 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 'use strict';
 
@@ -9,11 +20,11 @@
 
 const ELLIPSIS = '\u2026';
 const NBSP = '\xa0';
-const PASS_THRESHOLD = 0.75;
+const PASS_THRESHOLD = 0.9;
 
 const RATINGS = {
   PASS: {label: 'pass', minScore: PASS_THRESHOLD},
-  AVERAGE: {label: 'average', minScore: 0.45},
+  AVERAGE: {label: 'average', minScore: 0.5},
   FAIL: {label: 'fail'},
   ERROR: {label: 'error'},
 };
@@ -28,6 +39,52 @@
   }
 
   /**
+   * Returns a new LHR that's reshaped for slightly better ergonomics within the report rendereer.
+   * Also, sets up the localized UI strings used within renderer and number/date formatting
+   * The LHR passed in is not mutated.
+   * TODO(team): we all agree the LHR shape change is technical debt we should fix
+   * @param {LH.Result} result
+   * @return {LH.ReportResult}
+   */
+  static prepareReportResult(result) {
+    // If any mutations happen to the report within the renderers, we want the original object untouched
+    const clone = /** @type {LH.ReportResult} */ (JSON.parse(JSON.stringify(result)));
+
+    // If LHR is older (≤3.0.3), it has no locale setting. Set default.
+    if (!clone.configSettings.locale) {
+      clone.configSettings.locale = 'en';
+    }
+    Util.setNumberDateLocale(clone.configSettings.locale);
+    if (clone.i18n && clone.i18n.rendererFormattedStrings) {
+      Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
+    }
+
+    if (typeof clone.categories !== 'object') throw new Error('No categories provided.');
+    clone.reportCategories = Object.values(clone.categories);
+
+    // For convenience, smoosh all AuditResults into their auditDfn (which has just weight & group)
+    for (const category of clone.reportCategories) {
+      category.auditRefs.forEach(auditMeta => {
+        const result = clone.audits[auditMeta.id];
+        auditMeta.result = result;
+      });
+    }
+
+    return clone;
+  }
+
+
+  /**
+   * @param {LH.I18NRendererStrings} rendererFormattedStrings
+   */
+  static updateAllUIStrings(rendererFormattedStrings) {
+    // TODO(i18n): don't mutate these here but on the LHR and pass that around everywhere
+    for (const [key, value] of Object.entries(rendererFormattedStrings)) {
+      Util.UIStrings[key] = value;
+    }
+  }
+
+  /**
    * @param {string|Array<string|number>=} displayValue
    * @return {string}
    */
@@ -85,10 +142,7 @@
       case 'numeric':
       case 'binary':
       default:
-        // Numeric audits that are within PASS_THRESHOLD will still show up with failing.
-        // For opportunities, we want to have them show up with other failing for contrast.
-        // For diagnostics, we sort by score so they'll be lowest priority.
-        return Number(audit.score) === 1;
+        return Number(audit.score) >= RATINGS.PASS.minScore;
     }
   }
 
@@ -126,7 +180,7 @@
    */
   static formatNumber(number, granularity = 0.1) {
     const coarseValue = Math.round(number / granularity) * granularity;
-    return coarseValue.toLocaleString();
+    return coarseValue.toLocaleString(Util.numberDateLocale);
   }
 
   /**
@@ -135,7 +189,8 @@
    * @return {string}
    */
   static formatBytesToKB(size, granularity = 0.1) {
-    const kbs = (Math.round(size / 1024 / granularity) * granularity).toLocaleString();
+    const kbs = (Math.round(size / 1024 / granularity) * granularity)
+      .toLocaleString(Util.numberDateLocale);
     return `${kbs}${NBSP}KB`;
   }
 
@@ -146,7 +201,7 @@
    */
   static formatMilliseconds(ms, granularity = 10) {
     const coarseTime = Math.round(ms / granularity) * granularity;
-    return `${coarseTime.toLocaleString()}${NBSP}ms`;
+    return `${coarseTime.toLocaleString(Util.numberDateLocale)}${NBSP}ms`;
   }
 
   /**
@@ -156,7 +211,7 @@
    */
   static formatSeconds(ms, granularity = 0.1) {
     const coarseTime = Math.round(ms / 1000 / granularity) * granularity;
-    return `${coarseTime.toLocaleString()}${NBSP}s`;
+    return `${coarseTime.toLocaleString(Util.numberDateLocale)}${NBSP}s`;
   }
 
   /**
@@ -165,18 +220,19 @@
    * @return {string}
    */
   static formatDateTime(date) {
+    /** @type {Intl.DateTimeFormatOptions} */
     const options = {
       month: 'short', day: 'numeric', year: 'numeric',
       hour: 'numeric', minute: 'numeric', timeZoneName: 'short',
     };
-    let formatter = new Intl.DateTimeFormat('en-US', options);
+    let formatter = new Intl.DateTimeFormat(Util.numberDateLocale, options);
 
     // Force UTC if runtime timezone could not be detected.
     // See https://github.com/GoogleChrome/lighthouse/issues/1056
     const tz = formatter.resolvedOptions().timeZone;
     if (!tz || tz.toLowerCase() === 'etc/unknown') {
       options.timeZone = 'UTC';
-      formatter = new Intl.DateTimeFormat('en-US', options);
+      formatter = new Intl.DateTimeFormat(Util.numberDateLocale, options);
     }
     return formatter.format(new Date(date));
   }
@@ -297,15 +353,6 @@
   }
 
   /**
-   * @param {number} startTime
-   * @param {number} endTime
-   * @return {string}
-   */
-  static chainDuration(startTime, endTime) {
-    return Util.formatNumber((endTime - startTime) * 1000);
-  }
-
-  /**
    * @param {LH.Config.Settings} settings
    * @return {Array<{name: string, description: string}>}
    */
@@ -368,7 +415,12 @@
         summary = 'Unknown';
     }
 
-    const deviceEmulation = settings.disableDeviceEmulation ? 'No emulation' : 'Emulated Nexus 5X';
+    let deviceEmulation = 'No emulation';
+    if (!settings.disableDeviceEmulation) {
+      if (settings.emulatedFormFactor === 'mobile') deviceEmulation = 'Emulated Nexus 5X';
+      if (settings.emulatedFormFactor === 'desktop') deviceEmulation = 'Emulated Desktop';
+    }
+
     return {
       deviceEmulation,
       cpuThrottling,
@@ -376,8 +428,68 @@
       summary: `${deviceEmulation}, ${summary}`,
     };
   }
+
+  /**
+   * Set the locale to be used for Util's number and date formatting functions.
+   * @param {LH.Locale} locale
+   */
+  static setNumberDateLocale(locale) {
+    Util.numberDateLocale = locale;
+
+    // When testing, use a locale with more exciting numeric formatting
+    if (Util.numberDateLocale === 'en-XA') Util.numberDateLocale = 'de';
+  }
 }
 
+/**
+ * This value is updated on each run to the locale of the report
+ * @type {LH.Locale}
+ */
+Util.numberDateLocale = 'en';
+
+/**
+ * Report-renderer-specific strings.
+ * @type {LH.I18NRendererStrings}
+ */
+Util.UIStrings = {
+  /** Disclaimer shown to users below the metric values (First Contentful Paint, Time to Interactive, etc) to warn them that the numbers they see will likely change slightly the next time they run Lighthouse. */
+  varianceDisclaimer: 'Values are estimated and may vary.',
+  /** Column heading label for the listing of opportunity audits. Each audit title represents an opportunity. There are only 2 columns, so no strict character limit.  */
+  opportunityResourceColumnLabel: 'Opportunity',
+  /** Column heading label for the estimated page load savings of opportunity audits. Estimated Savings is the total amount of time (in seconds) that Lighthouse computed could be reduced from the total page load time, if the suggested action is taken. There are only 2 columns, so no strict character limit. */
+  opportunitySavingsColumnLabel: 'Estimated Savings',
+
+  /** An error string displayed next to a particular audit when it has errored, but not provided any specific error message. */
+  errorMissingAuditInfo: 'Report error: no audit information',
+  /** A label, shown next to an audit title or metric title, indicating that there was an error computing it. The user can hover on the label to reveal a tooltip with the extended error message. Translation should be short (< 20 characters). */
+  errorLabel: 'Error!',
+  /** This label is shown above a bulleted list of warnings. It is shown directly below an audit that produced warnings. Warnings describe situations the user should be aware of, as Lighthouse was unable to complete all the work required on this audit. For example, The 'Unable to decode image (biglogo.jpg)' warning may show up below an image encoding audit. */
+  warningHeader: 'Warnings: ',
+  /** The tooltip text on an expandable chevron icon. Clicking the icon expands a section to reveal a list of audit results that was hidden by default. */
+  auditGroupExpandTooltip: 'Show audits',
+  /** Section heading shown above a list of audits that are passing. 'Passed' here refers to a passing grade. This section is collapsed by default, as the user should be focusing on the failed audits instead. Users can click this heading to reveal the list. */
+  passedAuditsGroupTitle: 'Passed audits',
+  /** Section heading shown above a list of audits that do not apply to the page. For example, if an audit is 'Are images optimized?', but the page has no images on it, the audit will be marked as not applicable. This is neither passing or failing. This section is collapsed by default, as the user should be focusing on the failed audits instead. Users can click this heading to reveal the list. */
+  notApplicableAuditsGroupTitle: 'Not applicable',
+  /** Section heading shown above a list of audits that were not computed by Lighthouse. They serve as a list of suggestions for the user to go and manually check. For example, Lighthouse can't automate testing cross-browser compatibility, so that is listed within this section, so the user is reminded to test it themselves. This section is collapsed by default, as the user should be focusing on the failed audits instead. Users can click this heading to reveal the list. */
+  manualAuditsGroupTitle: 'Additional items to manually check',
+
+  /** Label shown preceding any important warnings that may have invalidated the entire report. For example, if the user has Chrome extensions installed, they may add enough performance overhead that Lighthouse's performance metrics are unreliable. If shown, this will be displayed at the top of the report UI. */
+  toplevelWarningsMessage: 'There were issues affecting this run of Lighthouse:',
+  /** Label preceding a pictorial explanation of the scoring scale: 0-50 is red (bad), 50-90 is orange (ok), 90-100 is green (good). These colors are used throughout the report to provide context for how good/bad a particular result is. */
+  scorescaleLabel: 'Score scale:',
+
+  /** String of text shown in a graphical representation of the flow of network requests for the web page. This label represents the initial network request that fetches an HTML page. This navigation may be redirected (eg. Initial navigation to http://example.com redirects to https://www.example.com). */
+  crcInitialNavigation: 'Initial Navigation',
+  /** Label of value shown in the summary of critical request chains. Refers to the total amount of time (milliseconds) of the longest critical path chain/sequence of network requests. Example value: 2310 ms */
+  crcLongestDurationLabel: 'Maximum critical path latency:',
+
+  /** Explanation shown to users below performance results to inform them that the test was done with a 3G network connection and to warn them that the numbers they see will likely change slightly the next time they run Lighthouse. 'Lighthouse' becomes link text to additional documentation. */
+  lsPerformanceCategoryDescription: '[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on emulated 3G. Values are estimated and may vary.',
+  /** Title of the lab data section of the Performance category. Within this section are various speed metrics which quantify the pageload performance into values presented in seconds and milliseconds. "Lab" is an abbreviated form of "laboratory", and refers to the fact that the data is from a controlled test of a website, not measurements from real users visiting that site.  */
+  labDataTitle: 'Lab Data',
+};
+
 if (typeof module !== 'undefined' && module.exports) {
   module.exports = Util;
 } else {
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report-styles.css b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report-styles.css
index d175f729..c65e8e5 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report-styles.css
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/report-styles.css
@@ -1,7 +1,18 @@
 /**
- * @license Copyright 2017 Google Inc. All Rights Reserved.
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ * @license
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
 .lh-vars {
@@ -43,7 +54,6 @@
   --metric-timeline-rule-color: #b3b3b3;
   --display-value-gray: hsl(216, 5%, 39%);
   --report-width: calc(60 * var(--body-font-size));
-  --report-content-width: calc(var(--report-width));
   --report-header-height: 161px;
   --report-header-color: #202124;
   --navitem-font-size: var(--body-font-size);
@@ -69,16 +79,17 @@
 
   /* Voodoo magic here to get narrow columns. 0 doesn't size the column like our friend 1px does */
   --bytes-col-width: 1px;
-
   --pass-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>check</title><path fill="hsl(139, 70%, 30%)" d="M24 4C12.95 4 4 12.95 4 24c0 11.04 8.95 20 20 20 11.04 0 20-8.96 20-20 0-11.05-8.96-20-20-20zm-4 30L10 24l2.83-2.83L20 28.34l15.17-15.17L38 16 20 34z"/></svg>');
   --average-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>info</title><path fill="hsl(31, 100%, 45%)" d="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm2 30h-4V22h4v12zm0-16h-4v-4h4v4z"/></svg>');
   --fail-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>warn</title><path fill="hsl(1, 73%, 45%)" d="M2 42h44L24 4 2 42zm24-6h-4v-4h4v4zm0-8h-4v-8h4v8z"/></svg>');
 
-  --av-timer-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M0 0h48v48H0z" fill="none"/><path d="M22 34c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zm0-28v8h4v-3.84c6.78.97 12 6.79 12 13.84 0 7.73-6.27 14-14 14s-14-6.27-14-14c0-3.36 1.18-6.43 3.15-8.85L24 26l2.83-2.83-13.6-13.6-.02.04C8.84 12.89 6 18.11 6 24c0 9.94 8.04 18 17.99 18S42 33.94 42 24 33.94 6 23.99 6H22zm14 18c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-24 0c0 1.1.9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2z" fill="hsl(216, 5%, 39%)"/></svg>');
+  --content-paste-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path fill="hsl(216, 5%, 39%)" d="M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z"/><path d="M0 0h24v24H0z" fill="none"/></svg>');
+  --av-timer-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="hsl(216, 5%, 39%)"><path d="M0 0h24v24H0z" fill="none"/><path d="M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42A8.962 8.962 0 0 0 12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9a8.994 8.994 0 0 0 7.03-14.61zM12 20c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></svg>');
   --photo-filter-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path fill="none" d="M0 0h48v48H0V0z"/><path d="M38.04 20v18H10V10h18V6H10.04c-2.2 0-4 1.8-4 4v28c0 2.2 1.8 4 4 4h28c2.2 0 4-1.8 4-4V20h-4zM34 20l1.88-4.12L40 14l-4.12-1.88L34 8l-1.88 4.12L28 14l4.12 1.88zm-7.5 1.5L24 16l-2.5 5.5L16 24l5.5 2.5L24 32l2.5-5.5L32 24z" fill="hsl(216, 5%, 39%)"/></svg>');
   --visibility-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M0 0h48v48H0z" fill="none"/><path d="M24 9C14 9 5.46 15.22 2 24c3.46 8.78 12 15 22 15 10.01 0 18.54-6.22 22-15-3.46-8.78-11.99-15-22-15zm0 25c-5.52 0-10-4.48-10-10s4.48-10 10-10 10 4.48 10 10-4.48 10-10 10zm0-16c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6z" fill="hsl(216, 5%, 39%)"/></svg>');
   --check-circle-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M0 0h48v48H0z" fill="none"/><path d="M24 4C12.95 4 4 12.95 4 24c0 11.04 8.95 20 20 20 11.04 0 20-8.96 20-20 0-11.05-8.96-20-20-20zm-4 30L10 24l2.83-2.83L20 28.34l15.17-15.17L38 16 20 34z" fill="hsl(216, 5%, 39%)"/></svg>');
   --check-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M0 0h48v48H0z" fill="none"/><path d="M18 32.34L9.66 24l-2.83 2.83L18 38l24-24-2.83-2.83z"/></svg>');
+
   --search-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><path d="M31 28h-1.59l-.55-.55C30.82 25.18 32 22.23 32 19c0-7.18-5.82-13-13-13S6 11.82 6 19s5.82 13 13 13c3.23 0 6.18-1.18 8.45-3.13l.55.55V31l10 9.98L40.98 38 31 28zm-12 0a9 9 0 1 1 .001-18.001A9 9 0 0 1 19 28z" fill="hsl(216, 5%, 39%)"/><path d="M0 0h48v48H0z" fill="none" /></svg>');
   --remove-circle-icon-url: url('data:image/svg+xml;utf8,<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z" fill="hsl(216, 5%, 39%)"/></svg>');
 }
@@ -131,27 +142,30 @@
     outline: -webkit-focus-ring-color auto 3px;
 }
 .lh-root summary:focus {
-    outline: 1px solid hsl(217, 89%, 61%);
+    outline: none;
+    box-shadow: 0 0 0 1px hsl(217, 89%, 61%);
 }
 
-
 .lh-root [hidden] {
   display: none !important;
 }
 
+.lh-root details > summary {
+  cursor: pointer;
+}
+
 .lh-audit-group a,
 .lh-category-header__description a {
   color: #0c50c7;
 }
 
-
-.lh-audit__description,
-.lh-load-opportunity__description,
-.lh-details {
+.lh-audit__description {
   --inner-audit-left-padding: calc(var(--text-indent) + var(--lh-audit-index-width) + 2 * var(--audit-item-gap));
   --inner-audit-right-padding: calc(var(--text-indent) + 2px);
-  margin-left: var(--inner-audit-left-padding);
-  margin-right: var(--inner-audit-right-padding);
+  padding-left: var(--inner-audit-left-padding);
+  padding-right: var(--inner-audit-right-padding);
+  padding-top: 8px;
+  padding-bottom: 8px;
 }
 
 .lh-details {
@@ -159,7 +173,7 @@
   margin-top: var(--default-padding);
   margin-bottom: var(--default-padding);
   /* whatever the .lh-details side margins are */
-  width: calc(100% - var(--inner-audit-left-padding) - var(--inner-audit-right-padding));
+  width: 100%;
 }
 
 .lh-details.flex .lh-code {
@@ -288,7 +302,6 @@
 .lh-audit__header {
   display: flex;
   padding: var(--lh-audit-vpadding) var(--text-indent);
-  cursor: pointer;
 }
 
 .lh-audit--load-opportunity .lh-audit__header {
@@ -307,17 +320,39 @@
 
 /* Perf Metric */
 
-.lh-metric-container {
+.lh-columns {
   display: flex;
+  width: 100%;
+}
+@media screen and (max-width: 640px) {
+  .lh-columns {
+    flex-wrap: wrap;
+
+  }
 }
 
-.lh-metric-column {
+.lh-column {
   flex: 1;
 }
-.lh-metric-column:first-of-type {
-  margin-right: 20px;
+.lh-column:first-of-type {
+  margin-right: 24px;
 }
 
+@media screen and (max-width: 800px) {
+  .lh-column:first-of-type {
+    margin-right: 8px;
+  }
+}
+@media screen and (max-width: 640px) {
+  .lh-column {
+    flex-basis: 100%;
+  }
+  .lh-column:first-of-type {
+    margin-right: 0px;
+  }
+}
+
+
 .lh-metric {
   border-bottom: 1px solid var(--report-secondary-border-color);
 }
@@ -336,6 +371,7 @@
   font-size: var(--body-font-size);
   line-height: var(--body-line-height);
   display: flex;
+  white-space: nowrap;
 }
 
 .lh-metric__name {
@@ -378,6 +414,7 @@
 
 .lh-metric--average .lh-metric__value {
   color: var(--average-color);
+  padding-left: 16px;
 }
 .lh-metric--average .lh-metric__value::after {
   background: var(--average-icon-url) no-repeat 50% 50%;
@@ -470,10 +507,10 @@
 
 .lh-filmstrip-container {
   padding: 0 var(--expandable-indent);
-  margin: 0 auto;
+  /* smaller gap between metrics and filmstrip */
+  margin: -16px auto 0 auto;
 }
 
-
 .lh-filmstrip {
   display: flex;
   flex-direction: row;
@@ -492,16 +529,22 @@
   max-width: 60px;
 }
 
+@media screen and (max-width: 750px) {
+  .lh-filmstrip {
+    flex-wrap: wrap;
+    justify-content: left;
+  }
+  .lh-filmstrip__frame {
+    margin: calc(var(--default-padding) / 3);
+  }
+}
+
 /* Audit */
 
 .lh-audit {
   border-bottom: 1px solid var(--report-secondary-border-color);
 }
 
-.lh-audit:last-child  {
-  border-bottom: none;
-}
-
 .lh-audit--error .lh-audit__display-text {
   color: var(--fail-color);
 }
@@ -509,12 +552,7 @@
 /* Audit Group */
 
 .lh-audit-group {
-  padding: var(--lh-audit-group-vpadding) 0;
-  border-bottom: 1px solid var(--report-secondary-border-color);
-}
-
-.lh-audit-group:last-child {
-  border-bottom: none;
+  margin: var(--lh-audit-group-vpadding) 0;
 }
 
 .lh-audit-group__header {
@@ -549,7 +587,7 @@
   background-image: var(--check-icon-url);
 }
 .lh-audit-group--diagnostics .lh-audit-group__header::before {
-  background-image: var(--search-icon-url);
+  background-image: var(--content-paste-icon-url);
 }
 .lh-audit-group--opportunities .lh-audit-group__header::before {
   background-image: var(--photo-filter-icon-url);
@@ -563,7 +601,7 @@
 
 /* Removing too much whitespace */
 .lh-audit-group--metrics {
-  margin-top: -28px;
+  margin-top: calc(var(--circle-size)/2 * -1);
   border-bottom: none;
 }
 
@@ -575,7 +613,10 @@
 
 .lh-audit-group__itemcount {
   color: var(--display-value-gray);
-  margin: 0 10px;
+  margin: 3px 10px 0;
+}
+.lh-audit-group__summary .lh-chevron {
+  margin-top: calc((var(--body-line-height) - 5px) / 2);
 }
 
 .lh-audit-group__description {
@@ -601,7 +642,7 @@
 
 .lh-container {
   display: flex;
-  max-width: var(--report-content-width);
+  max-width: var(--report-width);
   word-wrap: break-word;
   margin: 0 auto;
 }
@@ -620,7 +661,7 @@
 .lh-header-container {
   display: block;
   margin: 0 auto;
-  max-width: var(--report-content-width);
+  max-width: var(--report-width);
   position: relative;
   word-wrap: break-word;
 }
@@ -672,7 +713,7 @@
 
 .lh-scores-header {
   display: flex;
-  justify-content: center;
+  justify-content: left;
   overflow-x: hidden;
   position: relative;
   padding: var(--section-indent) calc(var(--section-indent) / 2) calc(var(--section-indent) * 2);
@@ -682,6 +723,10 @@
   border: 0;
 }
 
+.lh-scores-header .lh-gauge__wrapper {
+  margin: 0 4px;
+}
+
 .lh-scorescale {
   color: var(--medium-75-gray);
   padding: 0 calc(var(--section-indent) * 1.5) 0;
@@ -692,6 +737,7 @@
 
 .lh-scorescale-range {
   margin-left: 10px;
+  white-space: nowrap;
 }
 
 .lh-scorescale-range::before {
@@ -728,9 +774,7 @@
 
 .lh-category {
   --circle-size: calc(2.5 * var(--header-font-size));
-
   padding: var(--section-padding);
-  border-top: 1px solid var(--report-border-color);
 }
 
 .lh-category:first-of-type {
@@ -767,7 +811,7 @@
   float: right;
 }
 
-.lh-category .lh-score__gauge {
+.lh-category-header .lh-score__gauge {
   margin-left: var(--section-indent);
 }
 
@@ -862,19 +906,28 @@
   padding: 8px 6px;
 }
 
+/* Looks unnecessary, but mostly for keeping the <th>s left-aligned */
 .lh-table-column--text,
+.lh-table-column--url,
+/* .lh-table-column--thumbnail, */
+/* .lh-table-column--empty,*/
+.lh-table-column--code,
+.lh-table-column--node {
+  text-align: left;
+}
+
 .lh-table-column--bytes,
 .lh-table-column--timespanMs,
 .lh-table-column--ms {
   text-align: right;
 }
 
+
 .lh-table-column--thumbnail {
   width: calc(var(--image-preview-size) * 2);
 }
 
 .lh-table-column--url {
-  text-align: left;
   min-width: 250px;
   white-space: nowrap;
   max-width: 0;
@@ -882,8 +935,9 @@
 
 /* Keep bytes columns narrow if they follow the URL column */
 .lh-table-column--url + th.lh-table-column--bytes,
-.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--bytes {
-  width: var(--bytes-col-width);
+.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--bytes,
+.lh-table-column--url + .lh-table-column--bytes + th.lh-table-column--timespanMs {
+  max-width: var(--bytes-col-width);
 }
 
 .lh-table-column--code {
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html
index 770432f..29e93cb1 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html
+++ b/third_party/blink/renderer/devtools/front_end/audits2/lighthouse/templates.html
@@ -1,7 +1,24 @@
+<!--
+@license
+Copyright 2018 Google Inc. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS-IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
 <!-- Lighthouse run warnings -->
 <template id="tmpl-lh-warnings--toplevel">
   <div class="lh-warnings lh-warnings--toplevel">
-    <strong>There were issues affecting this run of Lighthouse:</strong>
+    <strong class="lh-warnings__msg"></strong>
     <ul></ul>
   </div>
 </template>
@@ -9,10 +26,10 @@
 <!-- Lighthouse score scale -->
 <template id="tmpl-lh-scorescale">
   <div class="lh-scorescale">
-    <span class="lh-scorescale-label">Score scale:</span>
-    <span class="lh-scorescale-range lh-scorescale-range--fail">0-44</span>
-    <span class="lh-scorescale-range lh-scorescale-range--average">45-74</span>
-    <span class="lh-scorescale-range lh-scorescale-range--pass">75-100</span>
+    <span class="lh-scorescale-label"></span>
+    <span class="lh-scorescale-range lh-scorescale-range--fail">0-49</span>
+    <span class="lh-scorescale-range lh-scorescale-range--average">50-89</span>
+    <span class="lh-scorescale-range lh-scorescale-range--pass">90-100</span>
   </div>
 </template>
 
@@ -90,12 +107,8 @@
 <!-- Lighthouse perf opportunity header -->
 <template id="tmpl-lh-opportunity-header">
   <div class="lh-load-opportunity__header lh-load-opportunity__cols">
-    <div class="lh-load-opportunity__col lh-load-opportunity__col--one">
-      Resource to optimize
-    </div>
-    <div class="lh-load-opportunity__col lh-load-opportunity__col--two">
-      Estimated Savings
-    </div>
+    <div class="lh-load-opportunity__col lh-load-opportunity__col--one"></div>
+    <div class="lh-load-opportunity__col lh-load-opportunity__col--two"></div>
   </div>
 </template>
 
@@ -151,7 +164,7 @@
       position: absolute;
       top: var(--report-header-height);
       right: 50%;
-      transform: translate3d(calc(var(--report-content-width) / 2), -100%, 0);
+      transform: translate3d(calc(var(--report-width) / 2), -100%, 0);
       opacity: 1;
       transform-origin: bottom right;
       will-change: transform, opacity;
@@ -394,6 +407,7 @@
     <div class="lh-export">
       <button class="report-icon report-icon--share lh-export__button" title="Export report"></button>
       <div class="lh-export__dropdown">
+        <!-- TODO(i18n): localize export dropdown -->
         <a href="#" class="report-icon report-icon--print" data-action="print-summary">Print Summary</a>
         <a href="#" class="report-icon report-icon--print" data-action="print-expanded">Print Expanded</a>
         <a href="#" class="report-icon report-icon--copy" data-action="copy">Copy JSON</a>
@@ -436,6 +450,7 @@
     }
   </style>
   <footer class="lh-footer">
+    <!-- TODO(i18n): localize runtime settings -->
     <div class="lh-env">
       <div class="lh-env__title">Runtime settings</div>
       <ul class="lh-env__items">
@@ -512,11 +527,12 @@
 
     .lh-gauge__percentage {
       --spacer: calc((var(--circle-size) - var(--inset-size)) / 2);
-      width: var(--inset-size);
+      width: 100%;
       height: var(--inset-size);
       position: absolute;
       border-radius: inherit;
       font-size: var(--header-font-size);
+      line-height: var(--header-font-size);
       text-align: center;
       top: calc(var(--circle-size) / 3);
     }
@@ -603,14 +619,17 @@
         color: #595959;
         font-style: italic;
       }
+      .lh-crc__summary-value {
+        margin-bottom: 10px;
+      }
     </style>
     <div>
-      Longest chain: <b class="lh-crc__longest_duration"><!-- fill me: longestChain.duration --></b>
-      over <b class="lh-crc__longest_length"><!-- fill me: longestChain.length --></b> requests, totalling
-      <b class="lh-crc__longest_transfersize"><!-- fill me: longestChain.length --></b>
+      <div class="lh-crc__summary-value">
+        <span class="lh-crc__longest_duration_label"></span> <b class="lh-crc__longest_duration"></b>
+      </div>
     </div>
     <div class="lh-crc">
-      <div class="crc-initial-nav">Initial Navigation</div>
+      <div class="crc-initial-nav"></div>
       <!-- stamp for each chain -->
       <template id="tmpl-lh-crc__chains">
         <div class="crc-node">
diff --git a/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-background.js b/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-background.js
index ff346f1..abda888 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-background.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2_worker/lighthouse/lighthouse-background.js
@@ -1,4 +1,4 @@
-// lighthouse, browserified. 3.0.3.1 (bf652a9fd8c04f445d820203960a905d6461277b)
+// lighthouse, browserified. 3.2.0 (081864eb30869df28f5ec05e28ca046b79b630cb)
 require=function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a;}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r);},p,p.exports,r,e,n,t);}return n[i].exports;}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o;}return r;}()({"../audits/accessibility/accesskeys":[function(require,module,exports){
 
 
@@ -1051,6 +1051,36 @@
 
 module.exports=HeadingLevels;
 
+},{"../../manual/manual-audit":4}],"../audits/accessibility/manual/interactive-element-affordance":[function(require,module,exports){
+
+
+
+
+
+
+'use strict';
+
+const ManualAudit=require('../../manual/manual-audit');
+
+
+
+
+
+class InteractiveElementAffordance extends ManualAudit{
+
+
+
+static get meta(){
+return Object.assign({
+id:'interactive-element-affordance',
+description:'Interactive elements, such as links and buttons, should indicate their state and be distinguishable from non-interactive elements. [Learn more](https://developers.google.com/web/fundamentals/accessibility/how-to-review#interactive_elements_like_links_and_buttons_should_indicate_their_purpose_and_state).',
+title:'Interactive elements indicate their purpose and state'},
+super.partialMeta);
+}}
+
+
+module.exports=InteractiveElementAffordance;
+
 },{"../../manual/manual-audit":4}],"../audits/accessibility/manual/logical-tab-order":[function(require,module,exports){
 
 
@@ -1521,6 +1551,7 @@
 module.exports=VideoDescription;
 
 },{"./axe-audit":1}],"../audits/bootup-time":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -1529,9 +1560,31 @@
 'use strict';
 
 const Audit=require('./audit');
-const Util=require('../report/html/renderer/util');
 const NetworkRequest=require('../lib/network-request');
 const{taskGroups}=require('../lib/task-groups');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'JavaScript execution time',
+
+failureTitle:'Reduce JavaScript execution time',
+
+description:'Consider reducing the time spent parsing, compiling, and executing JS. '+
+'You may find delivering smaller JS payloads helps with this. [Learn '+
+'more](https://developers.google.com/web/tools/lighthouse/audits/bootup).',
+
+columnTotal:'Total',
+
+columnScriptEval:'Script Evaluation',
+
+columnScriptParse:'Script Parse',
+
+chromeExtensionsWarning:'Chrome extensions negatively affected this page\'s load performance. '+
+'Try auditing the page in incognito mode or from a Chrome profile without extensions.'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class BootupTime extends Audit{
 
@@ -1540,12 +1593,10 @@
 static get meta(){
 return{
 id:'bootup-time',
-title:'JavaScript boot-up time',
-failureTitle:'JavaScript boot-up time is too high',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-description:'Consider reducing the time spent parsing, compiling, and executing JS. '+
-'You may find delivering smaller JS payloads helps with this. [Learn '+
-'more](https://developers.google.com/web/tools/lighthouse/audits/bootup).',
 requiredArtifacts:['traces']};
 
 }
@@ -1619,6 +1670,7 @@
 const jsURLs=BootupTime.getJavaScriptURLs(networkRecords);
 const executionTimings=BootupTime.getExecutionTimingsByURL(tasks,jsURLs);
 
+let hadExcessiveChromeExtension=false;
 let totalBootupTime=0;
 const results=Array.from(executionTimings).
 map(([url,timingByGroupId])=>{
@@ -1637,6 +1689,9 @@
 const scriptingTotal=timingByGroupId[taskGroups.scriptEvaluation.id]||0;
 const parseCompileTotal=timingByGroupId[taskGroups.scriptParseCompile.id]||0;
 
+hadExcessiveChromeExtension=hadExcessiveChromeExtension||
+url.startsWith('chrome-extension:')&&scriptingTotal>100;
+
 return{
 url:url,
 total:bootupTimeForURL,
@@ -1648,14 +1703,20 @@
 filter(result=>result.total>=context.options.thresholdInMs).
 sort((a,b)=>b.total-a.total);
 
+
+
+if(hadExcessiveChromeExtension){
+context.LighthouseRunWarnings.push(str_(UIStrings.chromeExtensionsWarning));
+}
+
 const summary={wastedMs:totalBootupTime};
 
 const headings=[
-{key:'url',itemType:'url',text:'URL'},
-{key:'total',granularity:1,itemType:'ms',text:'Total'},
-{key:'scripting',granularity:1,itemType:'ms',text:taskGroups.scriptEvaluation.label},
+{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+{key:'total',granularity:1,itemType:'ms',text:str_(UIStrings.columnTotal)},
+{key:'scripting',granularity:1,itemType:'ms',text:str_(UIStrings.columnScriptEval)},
 {key:'scriptParseCompile',granularity:1,itemType:'ms',
-text:taskGroups.scriptParseCompile.label}];
+text:str_(UIStrings.columnScriptParse)}];
 
 
 const details=BootupTime.makeTableDetails(headings,results,summary);
@@ -1669,15 +1730,19 @@
 return{
 score,
 rawValue:totalBootupTime,
-displayValue:[Util.MS_DISPLAY_VALUE,totalBootupTime],
+displayValue:totalBootupTime>0?
+str_(i18n.UIStrings.seconds,{timeInMs:totalBootupTime}):'',
 details};
 
 }}
 
 
 module.exports=BootupTime;
+module.exports.UIStrings=UIStrings;
 
-},{"../lib/network-request":38,"../lib/task-groups":43,"../report/html/renderer/util":48,"./audit":2}],"../audits/byte-efficiency/efficient-animated-content":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/bootup-time.js");
+},{"../lib/i18n/i18n.js":36,"../lib/network-request":88,"../lib/task-groups":93,"./audit":2}],"../audits/byte-efficiency/efficient-animated-content":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -1690,6 +1755,18 @@
 
 const NetworkRequest=require('../../lib/network-request');
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Use video formats for animated content',
+
+description:'Large GIFs are inefficient for delivering animated content. Consider using '+
+'MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save '+
+'network bytes. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 
 
@@ -1702,12 +1779,10 @@
 static get meta(){
 return{
 id:'efficient-animated-content',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-title:'Use video formats for animated content',
-description:'Large GIFs are inefficient for delivering animated content. Consider using '+
-'MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save '+
-'network bytes. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)',
-requiredArtifacts:['devtoolsLogs']};
+requiredArtifacts:['devtoolsLogs','traces']};
 
 }
 
@@ -1746,9 +1821,9 @@
 
 
 const headings=[
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Transfer Size'},
-{key:'wastedBytes',valueType:'bytes',label:'Byte Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
 return{
@@ -1759,8 +1834,11 @@
 
 
 module.exports=EfficientAnimatedContent;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/network-request":38,"./byte-efficiency-audit":3}],"../audits/byte-efficiency/offscreen-images":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/efficient-animated-content.js");
+},{"../../lib/i18n/i18n.js":36,"../../lib/network-request":88,"./byte-efficiency-audit":3}],"../audits/byte-efficiency/offscreen-images":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -1775,6 +1853,19 @@
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
 const Sentry=require('../../lib/sentry');
 const URL=require('../../lib/url-shim');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Defer offscreen images',
+
+description:
+'Consider lazy-loading offscreen and hidden images after all critical resources have '+
+'finished loading to lower time to interactive. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const ALLOWABLE_OFFSCREEN_X=100;
 const ALLOWABLE_OFFSCREEN_Y=200;
@@ -1792,13 +1883,10 @@
 static get meta(){
 return{
 id:'offscreen-images',
-title:'Defer offscreen images',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:
-'Consider lazy-loading offscreen and hidden images after all critical resources have '+
-'finished loading to lower time to interactive. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images).',
-requiredArtifacts:['ImageUsage','ViewportDimensions','traces','devtoolsLogs']};
+requiredArtifacts:['ImageUsage','ViewportDimensions','devtoolsLogs','traces']};
 
 }
 
@@ -1934,7 +2022,6 @@
 
 if(processed instanceof Error){
 warnings.push(processed.message);
-
 Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
 return results;
 }
@@ -1961,9 +2048,9 @@
 
 const headings=[
 {key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
 return{
@@ -1976,8 +2063,11 @@
 
 
 module.exports=OffscreenImages;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/sentry":40,"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/render-blocking-resources":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/offscreen-images.js");
+},{"../../lib/i18n/i18n.js":36,"../../lib/sentry":90,"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/render-blocking-resources":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -1990,6 +2080,7 @@
 'use strict';
 
 const Audit=require('../audit');
+const i18n=require('../../lib/i18n/i18n.js');
 const BaseNode=require('../../lib/dependency-graph/base-node');
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
 const UnusedCSS=require('./unused-css-rules');
@@ -2005,6 +2096,17 @@
 
 const MINIMUM_WASTED_MS=50;
 
+const UIStrings={
+
+title:'Eliminate render-blocking resources',
+
+description:'Resources are blocking the first paint of your page. Consider '+
+'delivering critical JS/CSS inline and deferring all non-critical '+
+'JS/styles. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
 
 
 
@@ -2032,12 +2134,9 @@
 static get meta(){
 return{
 id:'render-blocking-resources',
-title:'Eliminate render-blocking resources',
+title:str_(UIStrings.title),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-description:
-'Resources are blocking the first paint of your page. Consider '+
-'delivering critical JS/CSS inline and deferring all non-critical '+
-'JS/styles. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources).',
+description:str_(UIStrings.description),
 
 
 
@@ -2178,17 +2277,15 @@
 const{results,wastedMs}=await RenderBlockingResources.computeResults(artifacts,context);
 
 let displayValue='';
-if(results.length>1){
-displayValue=`${results.length} resources delayed first paint by ${wastedMs}ms`;
-}else if(results.length===1){
-displayValue=`${results.length} resource delayed first paint by ${wastedMs}ms`;
+if(results.length>0){
+displayValue=str_(i18n.UIStrings.displayValueMsSavings,{wastedMs});
 }
 
 
 const headings=[
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Size (KB)'},
-{key:'wastedMs',valueType:'timespanMs',label:'Download Time (ms)'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
 
 
 const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
@@ -2203,8 +2300,11 @@
 
 
 module.exports=RenderBlockingResources;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/dependency-graph/base-node":22,"../../lib/network-request":38,"../audit":2,"./byte-efficiency-audit":3,"./unused-css-rules":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/total-byte-weight":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/render-blocking-resources.js");
+},{"../../lib/dependency-graph/base-node":25,"../../lib/i18n/i18n.js":36,"../../lib/network-request":88,"../audit":2,"./byte-efficiency-audit":3,"./unused-css-rules":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/total-byte-weight":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -2213,6 +2313,23 @@
 'use strict';
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Avoids enormous network payloads',
+
+failureTitle:'Avoid enormous network payloads',
+
+description:
+'Large network payloads cost users real money and are highly correlated with '+
+'long load times. [Learn '+
+'more](https://developers.google.com/web/tools/lighthouse/audits/network-payloads).',
+
+displayValue:'Total size was {totalBytes, number, bytes}\xa0KB'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class TotalByteWeight extends ByteEfficiencyAudit{
 
@@ -2221,14 +2338,11 @@
 static get meta(){
 return{
 id:'total-byte-weight',
-title:'Avoids enormous network payloads',
-failureTitle:'Has enormous network payloads',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:
-'Large network payloads cost users real money and are highly correlated with '+
-'long load times. [Learn '+
-'more](https://developers.google.com/web/tools/lighthouse/audits/network-payloads).',
-requiredArtifacts:['devtoolsLogs']};
+requiredArtifacts:['devtoolsLogs','traces']};
 
 }
 
@@ -2283,15 +2397,8 @@
 
 
 const headings=[
-{key:'url',itemType:'url',text:'URL'},
-{
-key:'totalBytes',
-itemType:'bytes',
-displayUnit:'kb',
-granularity:1,
-text:'Total Size'},
-
-{key:'totalMs',itemType:'ms',text:'Transfer Time'}];
+{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize)}];
 
 
 const tableDetails=ByteEfficiencyAudit.makeTableDetails(headings,results);
@@ -2299,10 +2406,7 @@
 return{
 score,
 rawValue:totalBytes,
-displayValue:[
-'Total size was %d\xa0KB',
-totalBytes/1024],
-
+displayValue:str_(UIStrings.displayValue,{totalBytes}),
 extendedInfo:{
 value:{
 results,
@@ -2315,8 +2419,11 @@
 
 
 module.exports=TotalByteWeight;
+module.exports.UIStrings=UIStrings;
 
-},{"./byte-efficiency-audit":3}],"../audits/byte-efficiency/unminified-css":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/total-byte-weight.js");
+},{"../../lib/i18n/i18n.js":36,"./byte-efficiency-audit":3}],"../audits/byte-efficiency/unminified-css":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -2326,6 +2433,17 @@
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
 const UnusedCSSRules=require('./unused-css-rules');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Minify CSS',
+
+description:'Minifying CSS files can reduce network payload sizes. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/minify-css).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_PERCENT=5;
 const IGNORE_THRESHOLD_IN_BYTES=2048;
@@ -2340,11 +2458,10 @@
 static get meta(){
 return{
 id:'unminified-css',
-title:'Minify CSS',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:'Minifying CSS files can reduce network payload sizes. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/minify-css).',
-requiredArtifacts:['CSSUsage','devtoolsLogs']};
+requiredArtifacts:['CSSUsage','devtoolsLogs','traces']};
 
 }
 
@@ -2461,20 +2578,23 @@
 items.push(result);
 }
 
-return{
-items,
-headings:[
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}]};
+
+const headings=[
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
+return{items,headings};
 }}
 
 
 module.exports=UnminifiedCSS;
+module.exports.UIStrings=UIStrings;
 
-},{"./byte-efficiency-audit":3,"./unused-css-rules":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/unminified-javascript":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/unminified-css.js");
+},{"../../lib/i18n/i18n.js":36,"./byte-efficiency-audit":3,"./unused-css-rules":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/unminified-javascript":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -2483,8 +2603,18 @@
 'use strict';
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
-
 const esprima=require('esprima');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Minify JavaScript',
+
+description:'Minifying JavaScript files can reduce payload sizes and script parse time. '+
+'[Learn more](https://developers.google.com/speed/docs/insights/MinifyResources).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_PERCENT=10;
 const IGNORE_THRESHOLD_IN_BYTES=2048;
@@ -2506,12 +2636,10 @@
 static get meta(){
 return{
 id:'unminified-javascript',
-title:'Minify JavaScript',
-
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:'Minifying JavaScript files can reduce payload sizes and script parse time. '+
-'[Learn more](https://developers.google.com/speed/docs/insights/MinifyResources).',
-requiredArtifacts:['Scripts','devtoolsLogs']};
+requiredArtifacts:['Scripts','devtoolsLogs','traces']};
 
 }
 
@@ -2524,6 +2652,7 @@
 const contentLength=scriptContent.length;
 let totalTokenLength=0;
 
+
 const tokens=esprima.tokenize(scriptContent,{tolerant:true});
 if(!tokens.length&&tokens.errors&&tokens.errors.length){
 throw tokens.errors[0];
@@ -2573,21 +2702,27 @@
 }
 }
 
+
+const headings=[
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+
+
 return{
 items,
 warnings,
-headings:[
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}]};
-
+headings};
 
 }}
 
 
 module.exports=UnminifiedJavaScript;
+module.exports.UIStrings=UIStrings;
 
-},{"./byte-efficiency-audit":3,"esprima":118}],"../audits/byte-efficiency/unused-css-rules":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/unminified-javascript.js");
+},{"../../lib/i18n/i18n.js":36,"./byte-efficiency-audit":3,"esprima":162}],"../audits/byte-efficiency/unused-css-rules":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -2596,6 +2731,18 @@
 'use strict';
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Defer unused CSS',
+
+description:'Remove unused rules from stylesheets to reduce unnecessary '+
+'bytes consumed by network activity. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/unused-css).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_BYTES=2048;
 const PREVIEW_LENGTH=100;
@@ -2609,12 +2756,10 @@
 static get meta(){
 return{
 id:'unused-css-rules',
-title:'Defer unused CSS',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:'Remove unused rules from stylesheets to reduce unnecessary '+
-'bytes consumed by network activity. '+
-'[Learn more](https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery).',
-requiredArtifacts:['CSSUsage','URL','devtoolsLogs']};
+requiredArtifacts:['CSSUsage','URL','devtoolsLogs','traces']};
 
 }
 
@@ -2731,8 +2876,8 @@
 }
 
 const usage=UnusedCSSRules.computeUsage(stylesheetInfo);
-const result={url};
-return Object.assign(result,usage);
+
+return Object.assign({url},usage);
 }
 
 
@@ -2755,9 +2900,9 @@
 
 
 const headings=[
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
 return{
@@ -2769,8 +2914,11 @@
 
 
 module.exports=UnusedCSSRules;
+module.exports.UIStrings=UIStrings;
 
-},{"./byte-efficiency-audit":3}],"../audits/byte-efficiency/unused-javascript":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/unused-css-rules.js");
+},{"../../lib/i18n/i18n.js":36,"./byte-efficiency-audit":3}],"../audits/byte-efficiency/unused-javascript":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -2779,6 +2927,16 @@
 'use strict';
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Remove unused JavaScript',
+
+description:'Remove unused JavaScript to reduce bytes consumed by network activity.'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_BYTES=2048;
 
@@ -2789,10 +2947,10 @@
 static get meta(){
 return{
 id:'unused-javascript',
-title:'Unused JavaScript',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:'Remove unused JavaScript to reduce bytes consumed by network activity.',
-requiredArtifacts:['JsUsage','devtoolsLogs']};
+requiredArtifacts:['JsUsage','devtoolsLogs','traces']};
 
 }
 
@@ -2885,17 +3043,20 @@
 return{
 items,
 headings:[
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}]};
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}]};
 
 
 }}
 
 
 module.exports=UnusedJavaScript;
+module.exports.UIStrings=UIStrings;
 
-},{"./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-long-cache-ttl":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/unused-javascript.js");
+},{"../../lib/i18n/i18n.js":36,"./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-long-cache-ttl":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -2910,6 +3071,25 @@
 const NetworkRequest=require('../../lib/network-request');
 const URL=require('../../lib/url-shim');
 const linearInterpolation=require('../../lib/statistics').linearInterpolation;
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Uses efficient cache policy on static assets',
+
+failureTitle:'Serve static assets with an efficient cache policy',
+
+description:
+'A long cache lifetime can speed up repeat visits to your page. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/cache-policy).',
+
+displayValue:`{itemCount, plural,
+    =1 {1 resource found}
+    other {# resources found}
+    }`};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 
 const IGNORE_THRESHOLD_IN_PERCENT=0.925;
@@ -2921,13 +3101,11 @@
 static get meta(){
 return{
 id:'uses-long-cache-ttl',
-title:'Uses efficient cache policy on static assets',
-failureTitle:'Uses inefficient cache policy on static assets',
-description:
-'A long cache lifetime can speed up repeat visits to your page. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/cache-policy).',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['devtoolsLogs']};
+requiredArtifacts:['devtoolsLogs','traces']};
 
 }
 
@@ -3032,6 +3210,7 @@
 static isCacheableAsset(record){
 const CACHEABLE_STATUS_CODES=new Set([200,203,206]);
 
+
 const STATIC_RESOURCE_TYPES=new Set([
 NetworkRequest.TYPES.Font,
 NetworkRequest.TYPES.Image,
@@ -3066,8 +3245,14 @@
 
 const headers=new Map();
 for(const header of record.responseHeaders||[]){
+if(headers.has(header.name.toLowerCase())){
+const previousHeaderValue=headers.get(header.name.toLowerCase());
+headers.set(header.name.toLowerCase(),
+`${previousHeaderValue}, ${header.value}`);
+}else{
 headers.set(header.name.toLowerCase(),header.value);
 }
+}
 
 const cacheControl=parseCacheControl(headers.get('cache-control'));
 let cacheLifetimeInSeconds=CacheHeaders.computeCacheLifetimeInSeconds(
@@ -3110,10 +3295,12 @@
 
 
 const headings=[
-{key:'url',itemType:'url',text:'URL'},
-{key:'cacheLifetimeMs',itemType:'ms',text:'Cache TTL',displayUnit:'duration'},
-{key:'totalBytes',itemType:'bytes',text:'Size (KB)',displayUnit:'kb',
-granularity:1}];
+{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+
+{key:'cacheLifetimeMs',itemType:'ms',text:str_(i18n.UIStrings.columnCacheTTL),
+displayUnit:'duration'},
+{key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize),
+displayUnit:'kb',granularity:1}];
 
 
 const summary={wastedBytes:totalWastedBytes};
@@ -3122,7 +3309,7 @@
 return{
 score,
 rawValue:totalWastedBytes,
-displayValue:`${results.length} asset${results.length!==1?'s':''} found`,
+displayValue:str_(UIStrings.displayValue,{itemCount:results.length}),
 extendedInfo:{
 value:{
 results,
@@ -3136,8 +3323,11 @@
 
 
 module.exports=CacheHeaders;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/network-request":38,"../../lib/statistics":41,"../../lib/url-shim":"url","../audit":2,"assert":53,"parse-cache-control":129}],"../audits/byte-efficiency/uses-optimized-images":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js");
+},{"../../lib/i18n/i18n.js":36,"../../lib/network-request":88,"../../lib/statistics":91,"../../lib/url-shim":"url","../audit":2,"assert":102,"parse-cache-control":181}],"../audits/byte-efficiency/uses-optimized-images":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -3151,6 +3341,17 @@
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
 const URL=require('../../lib/url-shim');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Efficiently encode images',
+
+description:'Optimized images load faster and consume less cellular data. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/optimize-images).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_BYTES=4096;
 
@@ -3161,11 +3362,10 @@
 static get meta(){
 return{
 id:'uses-optimized-images',
-title:'Efficiently encode images',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:'Optimized images load faster and consume less cellular data. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/optimize-images).',
-requiredArtifacts:['OptimizedImages','devtoolsLogs']};
+requiredArtifacts:['OptimizedImages','devtoolsLogs','traces']};
 
 }
 
@@ -3213,9 +3413,9 @@
 
 const headings=[
 {key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
 return{
@@ -3227,8 +3427,11 @@
 
 
 module.exports=UsesOptimizedImages;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-responsive-images":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/uses-optimized-images.js");
+},{"../../lib/i18n/i18n.js":36,"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-responsive-images":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -3247,6 +3450,19 @@
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
 const Sentry=require('../../lib/sentry');
 const URL=require('../../lib/url-shim');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Properly size images',
+
+description:
+'Serve images that are appropriately-sized to save cellular data '+
+'and improve load time. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/oversized-images).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_BYTES=2048;
 
@@ -3257,13 +3473,10 @@
 static get meta(){
 return{
 id:'uses-responsive-images',
-title:'Properly size images',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:
-'Serve images that are appropriately-sized to save cellular data '+
-'and improve load time. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/oversized-images).',
-requiredArtifacts:['ImageUsage','ViewportDimensions','devtoolsLogs']};
+requiredArtifacts:['ImageUsage','ViewportDimensions','devtoolsLogs','traces']};
 
 }
 
@@ -3326,7 +3539,6 @@
 
 if(processed instanceof Error){
 warnings.push(processed.message);
-
 Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
 return;
 }
@@ -3344,9 +3556,9 @@
 
 const headings=[
 {key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
 return{
@@ -3358,8 +3570,11 @@
 
 
 module.exports=UsesResponsiveImages;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/sentry":40,"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-text-compression":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/uses-responsive-images.js");
+},{"../../lib/i18n/i18n.js":36,"../../lib/sentry":90,"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-text-compression":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -3373,6 +3588,18 @@
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
 const URL=require('../../lib/url-shim');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Enable text compression',
+
+description:'Text-based resources should be served with compression (gzip, deflate or'+
+' brotli) to minimize total network bytes.'+
+' [Learn more](https://developers.google.com/web/tools/lighthouse/audits/text-compression).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_BYTES=1400;
 const IGNORE_THRESHOLD_IN_PERCENT=0.1;
@@ -3384,12 +3611,10 @@
 static get meta(){
 return{
 id:'uses-text-compression',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-title:'Enable text compression',
-description:'Text-based responses should be served with compression (gzip, deflate or'+
-' brotli) to minimize total network bytes.'+
-' [Learn more](https://developers.google.com/web/tools/lighthouse/audits/text-compression).',
-requiredArtifacts:['ResponseCompression','devtoolsLogs']};
+requiredArtifacts:['ResponseCompression','devtoolsLogs','traces']};
 
 }
 
@@ -3436,9 +3661,9 @@
 
 
 const headings=[
-{key:'url',valueType:'url',label:'Uncompressed resource URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'GZIP Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
 return{
@@ -3449,8 +3674,11 @@
 
 
 module.exports=ResponsesAreCompressed;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-webp-images":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/uses-text-compression.js");
+},{"../../lib/i18n/i18n.js":36,"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/byte-efficiency/uses-webp-images":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -3463,6 +3691,18 @@
 
 const ByteEfficiencyAudit=require('./byte-efficiency-audit');
 const URL=require('../../lib/url-shim');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Serve images in next-gen formats',
+
+description:'Image formats like JPEG 2000, JPEG XR, and WebP often provide better '+
+'compression than PNG or JPEG, which means faster downloads and less data consumption. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/webp).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const IGNORE_THRESHOLD_IN_BYTES=8192;
 
@@ -3473,12 +3713,10 @@
 static get meta(){
 return{
 id:'uses-webp-images',
-title:'Serve images in next-gen formats',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-description:'Image formats like JPEG 2000, JPEG XR, and WebP often provide better '+
-'compression than PNG or JPEG, which means faster downloads and less data consumption. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/webp).',
-requiredArtifacts:['OptimizedImages','devtoolsLogs']};
+requiredArtifacts:['OptimizedImages','devtoolsLogs','traces']};
 
 }
 
@@ -3525,9 +3763,9 @@
 
 const headings=[
 {key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:'URL'},
-{key:'totalBytes',valueType:'bytes',label:'Original'},
-{key:'wastedBytes',valueType:'bytes',label:'Potential Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
 
 
 return{
@@ -3539,8 +3777,10 @@
 
 
 module.exports=UsesWebPImages;
+module.exports.UIStrings=UIStrings;
 
-},{"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/content-width":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/uses-webp-images.js");
+},{"../../lib/i18n/i18n.js":36,"../../lib/url-shim":"url","./byte-efficiency-audit":3}],"../audits/content-width":[function(require,module,exports){
 
 
 
@@ -3562,7 +3802,7 @@
 description:'If the width of your app\'s content doesn\'t match the width '+
 'of the viewport, your app might not be optimized for mobile screens. '+
 '[Learn more](https://developers.google.com/web/tools/lighthouse/audits/content-sized-correctly-for-viewport).',
-requiredArtifacts:['ViewportDimensions']};
+requiredArtifacts:['ViewportDimensions','HostUserAgent']};
 
 }
 
@@ -3570,15 +3810,29 @@
 
 
 
-static audit(artifacts){
+
+static audit(artifacts,context){
+const userAgent=artifacts.HostUserAgent;
 const viewportWidth=artifacts.ViewportDimensions.innerWidth;
 const windowWidth=artifacts.ViewportDimensions.outerWidth;
 const widthsMatch=viewportWidth===windowWidth;
 
+
+const isMobileHost=userAgent.includes('Android')||userAgent.includes('Mobile');
+const isMobile=context.settings.emulatedFormFactor==='mobile'||
+context.settings.emulatedFormFactor!=='desktop'&&isMobileHost;
+
+if(isMobile){
 return{
 rawValue:widthsMatch,
 explanation:this.createExplanation(widthsMatch,artifacts.ViewportDimensions)};
 
+}else{
+return{
+rawValue:true,
+notApplicable:true};
+
+}
 }
 
 
@@ -3599,6 +3853,7 @@
 module.exports=ContentWidth;
 
 },{"./audit":2}],"../audits/critical-request-chains":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -3607,7 +3862,25 @@
 'use strict';
 
 const Audit=require('./audit');
-const Util=require('../report/html/renderer/util');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Minimize Critical Requests Depth',
+
+description:'The Critical Request Chains below show you what resources are '+
+'loaded with a high priority. Consider reducing '+
+'the length of chains, reducing the download size of resources, or '+
+'deferring the download of unnecessary resources to improve page load. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains).',
+
+displayValue:`{itemCount, plural,
+    =1 {1 chain found}
+    other {# chains found}
+    }`};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class CriticalRequestChains extends Audit{
 
@@ -3616,13 +3889,9 @@
 static get meta(){
 return{
 id:'critical-request-chains',
-title:'Critical Request Chains',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-description:'The Critical Request Chains below show you what resources are '+
-'issued with a high priority. Consider reducing '+
-'the length of chains, reducing the download size of resources, or '+
-'deferring the download of unnecessary resources to improve page load. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains).',
 requiredArtifacts:['devtoolsLogs','URL']};
 
 }
@@ -3785,7 +4054,7 @@
 return{
 rawValue:chainCount===0,
 notApplicable:chainCount===0,
-displayValue:chainCount?`${Util.formatNumber(chainCount)} chains found`:'',
+displayValue:chainCount?str_(UIStrings.displayValue,{itemCount:chainCount}):'',
 extendedInfo:{
 value:{
 chains:flattenedChains,
@@ -3794,7 +4063,6 @@
 
 details:{
 type:'criticalrequestchain',
-header:{type:'text',text:'View critical network waterfall:'},
 chains:flattenedChains,
 longestChain}};
 
@@ -3804,8 +4072,10 @@
 
 
 module.exports=CriticalRequestChains;
+module.exports.UIStrings=UIStrings;
 
-},{"../report/html/renderer/util":48,"./audit":2}],"../audits/deprecations":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/critical-request-chains.js");
+},{"../lib/i18n/i18n.js":36,"./audit":2}],"../audits/deprecations":[function(require,module,exports){
 
 
 
@@ -3830,7 +4100,7 @@
 return{
 id:'deprecations',
 title:'Avoids deprecated APIs',
-failureTitle:'Uses deprecated API\'s',
+failureTitle:'Uses deprecated APIs',
 description:'Deprecated APIs will eventually be removed from the browser. '+
 '[Learn more](https://www.chromestatus.com/features#deprecated).',
 requiredArtifacts:['ChromeConsoleMessages']};
@@ -3880,7 +4150,7 @@
 
 module.exports=Deprecations;
 
-},{"../report/html/renderer/util":48,"./audit":2}],"../audits/dobetterweb/appcache-manifest":[function(require,module,exports){
+},{"../report/html/renderer/util":97,"./audit":2}],"../audits/dobetterweb/appcache-manifest":[function(require,module,exports){
 
 
 
@@ -4003,6 +4273,7 @@
 module.exports=Doctype;
 
 },{"../audit":2}],"../audits/dobetterweb/dom-size":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -4019,11 +4290,46 @@
 
 const Audit=require('../audit');
 const Util=require('../../report/html/renderer/util.js');
+const i18n=require('../../lib/i18n/i18n.js');
 
 const MAX_DOM_NODES=1500;
 const MAX_DOM_TREE_WIDTH=60;
 const MAX_DOM_TREE_DEPTH=32;
 
+const UIStrings={
+
+title:'Avoids an excessive DOM size',
+
+failureTitle:'Avoid an excessive DOM size',
+
+description:'Browser engineers recommend pages contain fewer than '+
+`~${MAX_DOM_NODES.toLocaleString()} DOM nodes. The sweet spot is a tree `+
+`depth < ${MAX_DOM_TREE_DEPTH} elements and fewer than ${MAX_DOM_TREE_WIDTH} `+
+'children/parent element. A large DOM can increase memory usage, cause longer '+
+'[style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), '+
+'and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/tools/lighthouse/audits/dom-size).',
+
+columnStatistic:'Statistic',
+
+columnElement:'Element',
+
+columnValue:'Value',
+
+displayValue:`{itemCount, plural,
+    =1 {1 node}
+    other {# nodes}
+    }`,
+
+statisticDOMNodes:'Total DOM Nodes',
+
+statisticDOMDepth:'Maximum DOM Depth',
+
+statisticDOMWidth:'Maximum Child Elements'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
+
 class DOMSize extends Audit{
 static get MAX_DOM_NODES(){
 return MAX_DOM_NODES;
@@ -4035,14 +4341,9 @@
 static get meta(){
 return{
 id:'dom-size',
-title:'Avoids an excessive DOM size',
-failureTitle:'Uses an excessive DOM size',
-description:'Browser engineers recommend pages contain fewer than '+
-`~${Util.formatNumber(DOMSize.MAX_DOM_NODES)} DOM nodes. The sweet spot is a tree `+
-`depth < ${MAX_DOM_TREE_DEPTH} elements and fewer than ${MAX_DOM_TREE_WIDTH} `+
-'children/parent element. A large DOM can increase memory usage, cause longer '+
-'[style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), '+
-'and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/tools/lighthouse/audits/dom-size).',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
 requiredArtifacts:['DOMStats']};
 
@@ -4077,34 +4378,40 @@
 
 
 const headings=[
-{key:'totalNodes',itemType:'text',text:'Total DOM Nodes'},
-{key:'depth',itemType:'text',text:'Maximum DOM Depth'},
-{key:'width',itemType:'text',text:'Maximum Children'}];
+{key:'statistic',itemType:'text',text:str_(UIStrings.columnStatistic)},
+{key:'element',itemType:'code',text:str_(UIStrings.columnElement)},
+{key:'value',itemType:'text',text:str_(UIStrings.columnValue)}];
+
 
 
 const items=[
 {
-totalNodes:Util.formatNumber(stats.totalDOMNodes),
-depth:Util.formatNumber(stats.depth.max),
-width:Util.formatNumber(stats.width.max)},
+statistic:str_(UIStrings.statisticDOMNodes),
+element:'',
+value:Util.formatNumber(stats.totalDOMNodes)},
 
 {
-totalNodes:'',
-depth:{
+statistic:str_(UIStrings.statisticDOMDepth),
+element:{
 type:'code',
 value:stats.depth.snippet},
 
-width:{
-type:'code',
-value:stats.width.snippet}}];
+value:Util.formatNumber(stats.depth.max)},
 
+{
+statistic:str_(UIStrings.statisticDOMWidth),
+element:{
+type:'code',
+value:stats.width.snippet},
+
+value:Util.formatNumber(stats.width.max)}];
 
 
 
 return{
 score,
 rawValue:stats.totalDOMNodes,
-displayValue:['%d nodes',stats.totalDOMNodes],
+displayValue:str_(UIStrings.displayValue,{itemCount:stats.totalDOMNodes}),
 extendedInfo:{
 value:items},
 
@@ -4114,8 +4421,10 @@
 
 
 module.exports=DOMSize;
+module.exports.UIStrings=UIStrings;
 
-},{"../../report/html/renderer/util.js":48,"../audit":2}],"../audits/dobetterweb/external-anchors-use-rel-noopener":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/dobetterweb/dom-size.js");
+},{"../../lib/i18n/i18n.js":36,"../../report/html/renderer/util.js":97,"../audit":2}],"../audits/dobetterweb/external-anchors-use-rel-noopener":[function(require,module,exports){
 
 
 
@@ -4151,16 +4460,12 @@
 const warnings=[];
 const pageHost=new URL(artifacts.URL.finalUrl).host;
 
-
-
-
 const failingAnchors=artifacts.AnchorsWithNoRelNoopener.
 filter(anchor=>{
 try{
 return new URL(anchor.href).host!==pageHost;
 }catch(err){
-
-warnings.push('Unable to determine the destination for anchor tag. '+
+warnings.push(`Unable to determine the destination for anchor (${anchor.outerHTML}). `+
 'If not used as a hyperlink, consider removing target=_blank.');
 return true;
 }
@@ -4173,10 +4478,7 @@
 href:anchor.href||'Unknown',
 target:anchor.target||'',
 rel:anchor.rel||'',
-url:'<a'+(
-anchor.href?` href="${anchor.href}"`:'')+(
-anchor.target?` target="${anchor.target}"`:'')+(
-anchor.rel?` rel="${anchor.rel}"`:'')+'>'};
+outerHTML:anchor.outerHTML||''};
 
 });
 
@@ -4261,7 +4563,61 @@
 
 module.exports=GeolocationOnStart;
 
-},{"../violation-audit":6}],"../audits/dobetterweb/no-document-write":[function(require,module,exports){
+},{"../violation-audit":6}],"../audits/dobetterweb/js-libraries":[function(require,module,exports){
+
+
+
+
+
+
+
+
+
+
+'use strict';
+
+const Audit=require('../audit');
+
+class JsLibrariesAudit extends Audit{
+
+
+
+static get meta(){
+return{
+id:'js-libraries',
+title:'Detected JavaScript libraries',
+description:'All front-end JavaScript libraries detected on the page.',
+requiredArtifacts:['JSLibraries']};
+
+}
+
+
+
+
+
+static audit(artifacts){
+const libDetails=artifacts.JSLibraries.map(lib=>({
+name:lib.name,
+version:lib.version,
+npm:lib.npmPkgName||null}));
+
+
+const headings=[
+{key:'name',itemType:'text',text:'Name'},
+{key:'version',itemType:'text',text:'Version'}];
+
+const details=Audit.makeTableDetails(headings,libDetails,{});
+
+return{
+rawValue:true,
+details};
+
+}}
+
+
+module.exports=JsLibrariesAudit;
+
+},{"../audit":2}],"../audits/dobetterweb/no-document-write":[function(require,module,exports){
 
 
 
@@ -4336,7 +4692,6 @@
 const Audit=require('../audit');
 const Sentry=require('../../lib/sentry');
 const semver=require('semver');
-
 const snykDatabase=require('../../../third-party/snyk/snapshot.json');
 
 const SEMVER_REGEX=/^(\d+\.\d+\.\d+)[^-0-9]+/;
@@ -4414,7 +4769,6 @@
 }catch(err){
 err.pkgName=lib.npmPkgName;
 
-
 Sentry.captureException(err,{level:'warning'});
 return[];
 }
@@ -4476,7 +4830,7 @@
 vulnCount,
 detectedLib:{
 text:lib.name+'@'+version,
-url:`https://snyk.io/vuln/npm:${lib.npmPkgName}?lh@${version}`,
+url:`https://snyk.io/vuln/npm:${lib.npmPkgName}?lh=${version}`,
 type:'link'}});
 
 
@@ -4519,7 +4873,7 @@
 
 module.exports=NoVulnerableLibrariesAudit;
 
-},{"../../../third-party/snyk/snapshot.json":137,"../../lib/sentry":40,"../audit":2,"semver":132}],"../audits/dobetterweb/no-websql":[function(require,module,exports){
+},{"../../../third-party/snyk/snapshot.json":189,"../../lib/sentry":90,"../audit":2,"semver":184}],"../audits/dobetterweb/no-websql":[function(require,module,exports){
 
 
 
@@ -4773,7 +5127,7 @@
 
 module.exports=UsesHTTP2Audit;
 
-},{"../../lib/url-shim":"url","../../report/html/renderer/util.js":48,"../audit":2}],"../audits/dobetterweb/uses-passive-event-listeners":[function(require,module,exports){
+},{"../../lib/url-shim":"url","../../report/html/renderer/util.js":97,"../audit":2}],"../audits/dobetterweb/uses-passive-event-listeners":[function(require,module,exports){
 
 
 
@@ -4912,7 +5266,59 @@
 
 module.exports=ErrorLogs;
 
-},{"./audit":2}],"../audits/font-display":[function(require,module,exports){
+},{"./audit":2}],"../audits/final-screenshot":[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+const Audit=require('./audit');
+const LHError=require('../lib/lh-error');
+
+class FinalScreenshot extends Audit{
+
+
+
+static get meta(){
+return{
+id:'final-screenshot',
+scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+title:'Final Screenshot',
+description:'The last screenshot captured of the pageload.',
+requiredArtifacts:['traces']};
+
+}
+
+
+
+
+
+static async audit(artifacts){
+const trace=artifacts.traces[Audit.DEFAULT_PASS];
+const screenshots=await artifacts.requestScreenshots(trace);
+const finalScreenshot=screenshots[screenshots.length-1];
+
+if(!finalScreenshot){
+throw new LHError(LHError.errors.NO_SCREENSHOTS);
+}
+
+return{
+rawValue:true,
+details:{
+type:'screenshot',
+timestamp:finalScreenshot.timestamp,
+data:finalScreenshot.datauri}};
+
+
+}}
+
+
+module.exports=FinalScreenshot;
+
+},{"../lib/lh-error":85,"./audit":2}],"../audits/font-display":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -4923,6 +5329,20 @@
 const Audit=require('./audit');
 const NetworkRequest=require('../lib/network-request');
 const allowedFontFaceDisplays=['block','fallback','optional','swap'];
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'All text remains visible during webfont loads',
+
+failureTitle:'Ensure text remains visible during webfont load',
+
+description:'Leverage the font-display CSS feature to ensure text is user-visible while '+
+'webfonts are loading. '+
+'[Learn more](https://developers.google.com/web/updates/2016/02/font-display).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class FontDisplay extends Audit{
 
@@ -4931,11 +5351,9 @@
 static get meta(){
 return{
 id:'font-display',
-title:'All text remains visible during webfont loads',
-failureTitle:'Text is invisible while webfonts are loading',
-description:'Leverage the font-display CSS feature to ensure text is user-visible while '+
-'webfonts are loading. '+
-'[Learn more](https://developers.google.com/web/updates/2016/02/font-display).',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
 requiredArtifacts:['devtoolsLogs','Fonts']};
 
 }
@@ -4969,17 +5387,17 @@
 map(record=>{
 
 
-const wastedTime=Math.min((record.endTime-record.startTime)*1000,3000);
+const wastedMs=Math.min((record.endTime-record.startTime)*1000,3000);
 
 return{
 url:record.url,
-wastedTime};
+wastedMs};
 
 });
 
 const headings=[
-{key:'url',itemType:'url',text:'Font URL'},
-{key:'wastedTime',itemType:'ms',granularity:1,text:'Font download time'}];
+{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+{key:'wastedMs',itemType:'ms',text:str_(i18n.UIStrings.columnWastedMs)}];
 
 const details=Audit.makeTableDetails(headings,results);
 
@@ -4993,8 +5411,10 @@
 
 
 module.exports=FontDisplay;
+module.exports.UIStrings=UIStrings;
 
-},{"../lib/network-request":38,"./audit":2}],"../audits/image-aspect-ratio":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/font-display.js");
+},{"../lib/i18n/i18n.js":36,"../lib/network-request":88,"./audit":2}],"../audits/image-aspect-ratio":[function(require,module,exports){
 
 
 
@@ -5186,7 +5606,7 @@
 
 module.exports=HTTPS;
 
-},{"../lib/url-shim":"url","../report/html/renderer/util":48,"./audit":2}],"../audits/load-fast-enough-for-pwa":[function(require,module,exports){
+},{"../lib/url-shim":"url","../report/html/renderer/util":97,"./audit":2}],"../audits/load-fast-enough-for-pwa":[function(require,module,exports){
 
 
 
@@ -5269,7 +5689,8 @@
 
 module.exports=LoadFastEnough4Pwa;
 
-},{"../config/constants":8,"./audit":2,"lodash.isequal":126}],"../audits/mainthread-work-breakdown":[function(require,module,exports){
+},{"../config/constants":8,"./audit":2,"lodash.isequal":178}],"../audits/mainthread-work-breakdown":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -5283,8 +5704,24 @@
 'use strict';
 
 const Audit=require('./audit');
-const Util=require('../report/html/renderer/util');
 const{taskGroups}=require('../lib/task-groups');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Minimizes main-thread work',
+
+failureTitle:'Minimize main-thread work',
+
+description:'Consider reducing the time spent parsing, compiling and executing JS. '+
+'You may find delivering smaller JS payloads helps with this.',
+
+columnCategory:'Category'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
+
 
 class MainThreadWorkBreakdown extends Audit{
 
@@ -5293,11 +5730,10 @@
 static get meta(){
 return{
 id:'mainthread-work-breakdown',
-title:'Minimizes main thread work',
-failureTitle:'Has significant main thread work',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-description:'Consider reducing the time spent parsing, compiling and executing JS. '+
-'You may find delivering smaller JS payloads helps with this.',
 requiredArtifacts:['traces']};
 
 }
@@ -5345,6 +5781,7 @@
 const executionTimings=MainThreadWorkBreakdown.getExecutionTimingsByGroup(tasks);
 
 let totalExecutionTime=0;
+
 const categoryTotals={};
 const results=Array.from(executionTimings).map(([groupId,rawDuration])=>{
 const duration=rawDuration*multiplier;
@@ -5361,8 +5798,8 @@
 });
 
 const headings=[
-{key:'groupLabel',itemType:'text',text:'Category'},
-{key:'duration',itemType:'ms',granularity:1,text:'Time Spent'}];
+{key:'groupLabel',itemType:'text',text:str_(UIStrings.columnCategory)},
+{key:'duration',itemType:'ms',granularity:1,text:str_(i18n.UIStrings.columnTimeSpent)}];
 
 
 results.sort((a,b)=>categoryTotals[b.group]-categoryTotals[a.group]);
@@ -5377,15 +5814,17 @@
 return{
 score,
 rawValue:totalExecutionTime,
-displayValue:[Util.MS_DISPLAY_VALUE,totalExecutionTime],
+displayValue:str_(i18n.UIStrings.seconds,{timeInMs:totalExecutionTime}),
 details:tableDetails};
 
 }}
 
 
 module.exports=MainThreadWorkBreakdown;
+module.exports.UIStrings=UIStrings;
 
-},{"../lib/task-groups":43,"../report/html/renderer/util":48,"./audit":2}],"../audits/manifest-short-name-length":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/mainthread-work-breakdown.js");
+},{"../lib/i18n/i18n.js":36,"../lib/task-groups":93,"./audit":2}],"../audits/manifest-short-name-length":[function(require,module,exports){
 
 
 
@@ -5394,6 +5833,7 @@
 'use strict';
 
 const Audit=require('./audit');
+const ManifestValues=require('../gather/computed/manifest-values');
 
 class ManifestShortNameLength extends Audit{
 
@@ -5415,8 +5855,9 @@
 
 
 
-static async audit(artifacts){
-const manifestValues=await artifacts.requestManifestValues(artifacts.Manifest);
+
+static async audit(artifacts,context){
+const manifestValues=await ManifestValues.request(context,artifacts.Manifest);
 
 if(manifestValues.isParseFailure){
 return{
@@ -5451,7 +5892,7 @@
 
 module.exports=ManifestShortNameLength;
 
-},{"./audit":2}],"../audits/manual/pwa-cross-browser":[function(require,module,exports){
+},{"../gather/computed/manifest-values":12,"./audit":2}],"../audits/manual/pwa-cross-browser":[function(require,module,exports){
 
 
 
@@ -5543,6 +5984,7 @@
 module.exports=PWAPageTransitions;
 
 },{"./manual-audit":4}],"../audits/metrics/estimated-input-latency":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -5551,6 +5993,19 @@
 'use strict';
 
 const Audit=require('../audit');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Estimated Input Latency',
+
+description:'The score above is an estimate of how long your app takes to respond to user '+
+'input, in milliseconds, during the busiest 5s window of page load. If your '+
+'latency is higher than 50 ms, users may perceive your app as laggy. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class EstimatedInputLatency extends Audit{
 
@@ -5559,11 +6014,8 @@
 static get meta(){
 return{
 id:'estimated-input-latency',
-title:'Estimated Input Latency',
-description:'The score above is an estimate of how long your app takes to respond to user '+
-'input, in milliseconds, during the busiest 5s window of page load. If your '+
-'latency is higher than 50 ms, users may perceive your app as laggy. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency).',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
 requiredArtifacts:['traces']};
 
@@ -5601,14 +6053,17 @@
 context.options.scoreMedian),
 
 rawValue:metricResult.timing,
-displayValue:['%d\xa0ms',metricResult.timing]};
+displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
 
 }}
 
 
 module.exports=EstimatedInputLatency;
+module.exports.UIStrings=UIStrings;
 
-},{"../audit":2}],"../audits/metrics/first-contentful-paint":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/metrics/estimated-input-latency.js");
+},{"../../lib/i18n/i18n.js":36,"../audit":2}],"../audits/metrics/first-contentful-paint":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -5617,7 +6072,17 @@
 'use strict';
 
 const Audit=require('../audit');
-const Util=require('../../report/html/renderer/util.js');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'First Contentful Paint',
+
+description:'First Contentful Paint marks the time at which the first text or image is '+
+`painted. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint).`};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class FirstContentfulPaint extends Audit{
 
@@ -5626,9 +6091,8 @@
 static get meta(){
 return{
 id:'first-contentful-paint',
-title:'First Contentful Paint',
-description:'First contentful paint marks the time at which the first text/image is '+
-`painted. [Learn more](https://developers.google.com/web/fundamentals/performance/user-centric-performance-metrics#first_paint_and_first_contentful_paint).`,
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
 requiredArtifacts:['traces','devtoolsLogs']};
 
@@ -5665,14 +6129,17 @@
 context.options.scoreMedian),
 
 rawValue:metricResult.timing,
-displayValue:[Util.MS_DISPLAY_VALUE,metricResult.timing]};
+displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
 
 }}
 
 
 module.exports=FirstContentfulPaint;
+module.exports.UIStrings=UIStrings;
 
-},{"../../report/html/renderer/util.js":48,"../audit":2}],"../audits/metrics/first-cpu-idle":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/metrics/first-contentful-paint.js");
+},{"../../lib/i18n/i18n.js":36,"../audit":2}],"../audits/metrics/first-cpu-idle":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -5681,7 +6148,18 @@
 'use strict';
 
 const Audit=require('../audit');
-const Util=require('../../report/html/renderer/util.js');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'First CPU Idle',
+
+description:'First CPU Idle marks the first time at which the page\'s main thread is '+
+'quiet enough to handle input. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-interactive).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class FirstCPUIdle extends Audit{
 
@@ -5690,10 +6168,8 @@
 static get meta(){
 return{
 id:'first-cpu-idle',
-title:'First CPU Idle',
-description:'First CPU Idle marks the first time at which the page\'s main thread is '+
-'quiet enough to handle input. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-interactive).',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
 requiredArtifacts:['traces']};
 
@@ -5733,14 +6209,17 @@
 context.options.scoreMedian),
 
 rawValue:metricResult.timing,
-displayValue:[Util.MS_DISPLAY_VALUE,metricResult.timing]};
+displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
 
 }}
 
 
 module.exports=FirstCPUIdle;
+module.exports.UIStrings=UIStrings;
 
-},{"../../report/html/renderer/util.js":48,"../audit":2}],"../audits/metrics/first-meaningful-paint":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/metrics/first-cpu-idle.js");
+},{"../../lib/i18n/i18n.js":36,"../audit":2}],"../audits/metrics/first-meaningful-paint":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -5749,7 +6228,17 @@
 'use strict';
 
 const Audit=require('../audit');
-const Util=require('../../report/html/renderer/util');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'First Meaningful Paint',
+
+description:'First Meaningful Paint measures when the primary content of a page is '+
+'visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class FirstMeaningfulPaint extends Audit{
 
@@ -5758,9 +6247,8 @@
 static get meta(){
 return{
 id:'first-meaningful-paint',
-title:'First Meaningful Paint',
-description:'First Meaningful Paint measures when the primary content of a page is '+
-'visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint).',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
 requiredArtifacts:['traces']};
 
@@ -5800,14 +6288,17 @@
 context.options.scoreMedian),
 
 rawValue:metricResult.timing,
-displayValue:[Util.MS_DISPLAY_VALUE,metricResult.timing]};
+displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
 
 }}
 
 
 module.exports=FirstMeaningfulPaint;
+module.exports.UIStrings=UIStrings;
 
-},{"../../report/html/renderer/util":48,"../audit":2}],"../audits/metrics/interactive":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/metrics/first-meaningful-paint.js");
+},{"../../lib/i18n/i18n.js":36,"../audit":2}],"../audits/metrics/interactive":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -5816,7 +6307,17 @@
 'use strict';
 
 const Audit=require('../audit');
-const Util=require('../../report/html/renderer/util');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Time to Interactive',
+
+description:'Interactive marks the time at which the page is fully interactive. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 
 
@@ -5831,9 +6332,8 @@
 static get meta(){
 return{
 id:'interactive',
-title:'Time to Interactive',
-description:'Interactive marks the time at which the page is fully interactive. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive).',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
 requiredArtifacts:['traces','devtoolsLogs']};
 
@@ -5879,7 +6379,7 @@
 context.options.scoreMedian),
 
 rawValue:timeInMs,
-displayValue:[Util.MS_DISPLAY_VALUE,timeInMs],
+displayValue:str_(i18n.UIStrings.seconds,{timeInMs}),
 extendedInfo:{
 value:extendedInfo}};
 
@@ -5888,8 +6388,11 @@
 
 
 module.exports=InteractiveMetric;
+module.exports.UIStrings=UIStrings;
 
-},{"../../report/html/renderer/util":48,"../audit":2}],"../audits/metrics/speed-index":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/metrics/interactive.js");
+},{"../../lib/i18n/i18n.js":36,"../audit":2}],"../audits/metrics/speed-index":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -5898,7 +6401,17 @@
 'use strict';
 
 const Audit=require('../audit');
-const Util=require('../../report/html/renderer/util');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Speed Index',
+
+description:'Speed Index shows how quickly the contents of a page are visibly populated. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class SpeedIndex extends Audit{
 
@@ -5907,9 +6420,8 @@
 static get meta(){
 return{
 id:'speed-index',
-title:'Speed Index',
-description:'Speed Index shows how quickly the contents of a page are visibly populated. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index).',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
 requiredArtifacts:['traces','devtoolsLogs']};
 
@@ -5948,14 +6460,16 @@
 context.options.scoreMedian),
 
 rawValue:metricResult.timing,
-displayValue:[Util.MS_DISPLAY_VALUE,metricResult.timing]};
+displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
 
 }}
 
 
 module.exports=SpeedIndex;
+module.exports.UIStrings=UIStrings;
 
-},{"../../report/html/renderer/util":48,"../audit":2}],"../audits/metrics":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/metrics/speed-index.js");
+},{"../../lib/i18n/i18n.js":36,"../audit":2}],"../audits/metrics":[function(require,module,exports){
 
 
 
@@ -6247,7 +6761,7 @@
 
 module.exports=MixedContent;
 
-},{"../lib/url-shim":"url","../report/html/renderer/util":48,"./audit":2}],"../audits/network-requests":[function(require,module,exports){
+},{"../lib/url-shim":"url","../report/html/renderer/util":97,"./audit":2}],"../audits/network-requests":[function(require,module,exports){
 
 
 
@@ -6421,7 +6935,7 @@
 
 module.exports=PredictivePerf;
 
-},{"../report/html/renderer/util":48,"./audit":2}],"../audits/redirects-http":[function(require,module,exports){
+},{"../report/html/renderer/util":97,"./audit":2}],"../audits/redirects-http":[function(require,module,exports){
 
 
 
@@ -6460,6 +6974,7 @@
 module.exports=RedirectsHTTP;
 
 },{"./audit":2}],"../audits/redirects":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -6469,6 +6984,16 @@
 
 const Audit=require('./audit');
 const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Avoid multiple page redirects',
+
+description:'Redirects introduce additional delays before the page can be loaded. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/redirects).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 class Redirects extends Audit{
 
@@ -6477,9 +7002,9 @@
 static get meta(){
 return{
 id:'redirects',
-title:'Avoid multiple page redirects',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-description:'Redirects introduce additional delays before the page can be loaded. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/redirects).',
 requiredArtifacts:['URL','devtoolsLogs','traces']};
 
 }
@@ -6546,18 +7071,20 @@
 
 }
 
-const headings=[
-{key:'url',itemType:'text',text:'Redirected URL'},
-{key:'wastedMs',itemType:'ms',text:'Time for Redirect'}];
 
-const summary={wastedMs:totalWastedMs};
-const details=Audit.makeTableDetails(headings,pageRedirects,summary);
+const headings=[
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnTimeSpent)}];
+
+const details=Audit.makeOpportunityDetails(headings,pageRedirects,totalWastedMs);
 
 return{
 
 score:redirectRequests.length<=2?1:UnusedBytes.scoreForWastedMs(totalWastedMs),
 rawValue:totalWastedMs,
-displayValue:['%d\xa0ms',totalWastedMs],
+displayValue:totalWastedMs?
+str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:totalWastedMs}):
+'',
 extendedInfo:{
 value:{
 wastedMs:totalWastedMs}},
@@ -6569,8 +7096,10 @@
 
 
 module.exports=Redirects;
+module.exports.UIStrings=UIStrings;
 
-},{"./audit":2,"./byte-efficiency/byte-efficiency-audit":3}],"../audits/screenshot-thumbnails":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/redirects.js");
+},{"../lib/i18n/i18n.js":36,"./audit":2,"./byte-efficiency/byte-efficiency-audit":3}],"../audits/screenshot-thumbnails":[function(require,module,exports){
 
 
 
@@ -6579,7 +7108,7 @@
 'use strict';
 
 const Audit=require('./audit');
-const LHError=require('../lib/errors');
+const LHError=require('../lib/lh-error');
 const jpeg=require('jpeg-js');
 
 const NUMBER_OF_THUMBNAILS=10;
@@ -6687,14 +7216,15 @@
 }
 });
 }
-
+let base64Data;
+if(cachedThumbnails.has(frameForTimestamp)){
+base64Data=cachedThumbnails.get(frameForTimestamp);
+}else{
 const imageData=frameForTimestamp.getParsedImage();
 const thumbnailImageData=ScreenshotThumbnails.scaleImageToThumbnail(imageData);
-const base64Data=
-cachedThumbnails.get(frameForTimestamp)||
-jpeg.encode(thumbnailImageData,90).data.toString('base64');
-
+base64Data=jpeg.encode(thumbnailImageData,90).data.toString('base64');
 cachedThumbnails.set(frameForTimestamp,base64Data);
+}
 thumbnails.push({
 timing:Math.round(targetTimestamp-speedline.beginning),
 timestamp:targetTimestamp*1000,
@@ -6716,7 +7246,7 @@
 
 module.exports=ScreenshotThumbnails;
 
-},{"../lib/errors":33,"./audit":2,"jpeg-js":122}],"../audits/seo/canonical":[function(require,module,exports){
+},{"../lib/lh-error":85,"./audit":2,"jpeg-js":175}],"../audits/seo/canonical":[function(require,module,exports){
 
 
 
@@ -6893,7 +7423,7 @@
 
 module.exports=Canonical;
 
-},{"../../lib/url-shim":"url","../audit":2,"http-link-header":119}],"../audits/seo/font-size":[function(require,module,exports){
+},{"../../lib/url-shim":"url","../audit":2,"http-link-header":163}],"../audits/seo/font-size":[function(require,module,exports){
 
 
 
@@ -6903,12 +7433,9 @@
 
 
 
-
 const URL=require('../../lib/url-shim');
 const Audit=require('../audit');
 const ViewportAudit=require('../viewport');
-const WebInspector=require('../../lib/web-inspector');
-const CSSStyleDeclaration=WebInspector.CSSStyleDeclaration;
 const MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT=60;
 
 
@@ -7003,8 +7530,8 @@
 function findStyleRuleSource(baseURL,styleDeclaration,node){
 if(
 !styleDeclaration||
-styleDeclaration.type===CSSStyleDeclaration.Type.Attributes||
-styleDeclaration.type===CSSStyleDeclaration.Type.Inline)
+styleDeclaration.type==='Attributes'||
+styleDeclaration.type==='Inline')
 {
 return{
 selector:nodeToTableNode(node),
@@ -7020,7 +7547,7 @@
 
 }
 
-if(styleDeclaration.type===CSSStyleDeclaration.Type.Regular&&styleDeclaration.parentRule){
+if(styleDeclaration.type==='Regular'&&styleDeclaration.parentRule){
 const rule=styleDeclaration.parentRule;
 const stylesheet=styleDeclaration.stylesheet;
 
@@ -7065,7 +7592,7 @@
 
 
 function getFontArtifactId(styleDeclaration,node){
-if(styleDeclaration&&styleDeclaration.type===CSSStyleDeclaration.Type.Regular){
+if(styleDeclaration&&styleDeclaration.type==='Regular'){
 const startLine=styleDeclaration.range?styleDeclaration.range.startLine:0;
 const startColumn=styleDeclaration.range?styleDeclaration.range.startColumn:0;
 return`${styleDeclaration.styleSheetId}@${startLine}:${startColumn}`;
@@ -7194,7 +7721,7 @@
 
 module.exports=FontSize;
 
-},{"../../lib/url-shim":"url","../../lib/web-inspector":47,"../audit":2,"../viewport":"../audits/viewport"}],"../audits/seo/hreflang":[function(require,module,exports){
+},{"../../lib/url-shim":"url","../audit":2,"../viewport":"../audits/viewport"}],"../audits/seo/hreflang":[function(require,module,exports){
 (function(global){
 
 
@@ -7317,7 +7844,7 @@
 module.exports=Hreflang;
 
 }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"../audit":2,"axe-core/lib/commons/utils/valid-langs.js":98,"http-link-header":119}],"../audits/seo/http-status-code":[function(require,module,exports){
+},{"../audit":2,"axe-core/lib/commons/utils/valid-langs.js":152,"http-link-header":163}],"../audits/seo/http-status-code":[function(require,module,exports){
 
 
 
@@ -7508,7 +8035,7 @@
 
 module.exports=IsCrawlable;
 
-},{"../../lib/url-shim":"url","../audit":2,"robots-parser":131}],"../audits/seo/link-text":[function(require,module,exports){
+},{"../../lib/url-shim":"url","../audit":2,"robots-parser":183}],"../audits/seo/link-text":[function(require,module,exports){
 
 
 
@@ -8143,6 +8670,7 @@
 'use strict';
 
 const MultiCheckAudit=require('./multi-check-audit');
+const ManifestValues=require('../gather/computed/manifest-values');
 
 
 
@@ -8203,24 +8731,24 @@
 
 
 
-static audit_(artifacts){
+
+static async audit_(artifacts,context){
 
 const failures=[];
 
-return artifacts.requestManifestValues(artifacts.Manifest).then(manifestValues=>{
+const manifestValues=await ManifestValues.request(context,artifacts.Manifest);
 SplashScreen.assessManifest(manifestValues,failures);
 
 return{
 failures,
 manifestValues};
 
-});
 }}
 
 
 module.exports=SplashScreen;
 
-},{"./multi-check-audit":5}],"../audits/themed-omnibox":[function(require,module,exports){
+},{"../gather/computed/manifest-values":12,"./multi-check-audit":5}],"../audits/themed-omnibox":[function(require,module,exports){
 
 
 
@@ -8229,7 +8757,8 @@
 'use strict';
 
 const MultiCheckAudit=require('./multi-check-audit');
-const validColor=require('../lib/web-inspector').Color.parse;
+const ManifestValues=require('../gather/computed/manifest-values');
+const cssParsers=require('cssstyle/lib/parsers');
 
 
 
@@ -8260,10 +8789,18 @@
 
 
 
+static isValidColor(color){
+return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
+}
+
+
+
+
+
 static assessMetaThemecolor(themeColorMeta,failures){
 if(themeColorMeta===null){
 failures.push('No `<meta name="theme-color">` tag found');
-}else if(!validColor(themeColorMeta)){
+}else if(!ThemedOmnibox.isValidColor(themeColorMeta)){
 failures.push('The theme-color meta tag did not contain a valid CSS color');
 }
 }
@@ -8288,11 +8825,12 @@
 
 
 
-static audit_(artifacts){
+
+static async audit_(artifacts,context){
 
 const failures=[];
 
-return artifacts.requestManifestValues(artifacts.Manifest).then(manifestValues=>{
+const manifestValues=await ManifestValues.request(context,artifacts.Manifest);
 ThemedOmnibox.assessManifest(manifestValues,failures);
 ThemedOmnibox.assessMetaThemecolor(artifacts.ThemeColor,failures);
 
@@ -8301,13 +8839,13 @@
 manifestValues,
 themeColor:artifacts.ThemeColor};
 
-});
 }}
 
 
 module.exports=ThemedOmnibox;
 
-},{"../lib/web-inspector":47,"./multi-check-audit":5}],"../audits/time-to-first-byte":[function(require,module,exports){
+},{"../gather/computed/manifest-values":12,"./multi-check-audit":5,"cssstyle/lib/parsers":161}],"../audits/time-to-first-byte":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -8316,6 +8854,21 @@
 'use strict';
 
 const Audit=require('./audit');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Server response times are low (TTFB)',
+
+failureTitle:'Reduce server response times (TTFB)',
+
+description:'Time To First Byte identifies the time at which your server sends a response.'+
+' [Learn more](https://developers.google.com/web/tools/lighthouse/audits/ttfb).',
+
+displayValue:`Root document took {timeInMs, number, milliseconds}\xa0ms`};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 const TTFB_THRESHOLD=600;
 
@@ -8326,9 +8879,9 @@
 static get meta(){
 return{
 id:'time-to-first-byte',
-title:'Keep server response times low (TTFB)',
-description:'Time To First Byte identifies the time at which your server sends a response.'+
-' [Learn more](https://developers.google.com/web/tools/lighthouse/audits/ttfb).',
+title:str_(UIStrings.title),
+failureTitle:str_(UIStrings.failureTitle),
+description:str_(UIStrings.description),
 requiredArtifacts:['devtoolsLogs','URL']};
 
 }
@@ -8345,25 +8898,13 @@
 
 
 
-static audit(artifacts){
-const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+static async audit(artifacts){
+const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+const mainResource=await artifacts.requestMainResource({devtoolsLog,URL:artifacts.URL});
 
-return artifacts.requestNetworkRecords(devtoolsLogs).
-then(networkRecords=>{
-
-let displayValue='';
-
-const finalUrl=artifacts.URL.finalUrl;
-const finalUrlRequest=networkRecords.find(record=>record.url===finalUrl);
-if(!finalUrlRequest){
-throw new Error(`finalUrl '${finalUrl} not found in network records.`);
-}
-const ttfb=TTFBMetric.caclulateTTFB(finalUrlRequest);
+const ttfb=TTFBMetric.caclulateTTFB(mainResource);
 const passed=ttfb<TTFB_THRESHOLD;
-
-if(!passed){
-displayValue=['Root document took %10d',ttfb];
-}
+const displayValue=str_(UIStrings.displayValue,{timeInMs:ttfb});
 
 
 const details={
@@ -8384,13 +8925,15 @@
 
 
 
-});
 }}
 
 
 module.exports=TTFBMetric;
+module.exports.UIStrings=UIStrings;
 
-},{"./audit":2}],"../audits/user-timings":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/time-to-first-byte.js");
+},{"../lib/i18n/i18n.js":36,"./audit":2}],"../audits/user-timings":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -8399,6 +8942,31 @@
 'use strict';
 
 const Audit=require('./audit');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'User Timing marks and measures',
+
+description:'Consider instrumenting your app with the User Timing API to measure your '+
+'app\'s real-world performance during key user experiences. '+
+'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing).',
+
+displayValue:`{itemCount, plural,
+    =1 {1 user timing}
+    other {# user timings}
+    }`,
+
+columnName:'Name',
+
+columnType:'Type',
+
+columnStartTime:'Start Time',
+
+columnDuration:'Duration'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
 
 
@@ -8410,11 +8978,9 @@
 static get meta(){
 return{
 id:'user-timings',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:'User Timing marks and measures',
-description:'Consider instrumenting your app with the User Timing API to create custom, '+
-'real-world measurements of key user experiences. '+
-'[Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing).',
 requiredArtifacts:['traces']};
 
 }
@@ -8426,6 +8992,7 @@
 static filterTrace(tabTrace){
 
 const userTimings=[];
+
 const measuresStartTimes={};
 
 
@@ -8527,10 +9094,11 @@
 });
 
 const headings=[
-{key:'name',itemType:'text',text:'Name'},
-{key:'timingType',itemType:'text',text:'Type'},
-{key:'startTime',itemType:'ms',granularity:0.01,text:'Start Time'},
-{key:'duration',itemType:'ms',granularity:0.01,text:'Duration'}];
+{key:'name',itemType:'text',text:str_(UIStrings.columnName)},
+{key:'timingType',itemType:'text',text:str_(UIStrings.columnType)},
+{key:'startTime',itemType:'ms',granularity:0.01,
+text:str_(UIStrings.columnStartTime)},
+{key:'duration',itemType:'ms',granularity:0.01,text:str_(UIStrings.columnDuration)}];
 
 
 const details=Audit.makeTableDetails(headings,tableRows);
@@ -8538,10 +9106,7 @@
 
 let displayValue;
 if(userTimings.length){
-displayValue=[
-userTimings.length===1?'%d user timing':'%d user timings',
-userTimings.length];
-
+displayValue=str_(UIStrings.displayValue,{itemCount:userTimings.length});
 }
 
 return{
@@ -8559,8 +9124,11 @@
 
 
 module.exports=UserTimings;
+module.exports.UIStrings=UIStrings;
 
-},{"./audit":2}],"../audits/uses-rel-preconnect":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/user-timings.js");
+},{"../lib/i18n/i18n.js":36,"./audit":2}],"../audits/uses-rel-preconnect":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -8571,6 +9139,8 @@
 
 const Audit=require('./audit');
 const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit');
+const i18n=require('../lib/i18n/i18n.js');
+
 
 
 
@@ -8579,6 +9149,17 @@
 
 const IGNORE_THRESHOLD_IN_MS=50;
 
+const UIStrings={
+
+title:'Preconnect to required origins',
+
+description:
+'Consider adding preconnect or dns-prefetch resource hints to establish early '+
+`connections to important third-party origins. [Learn more](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect).`};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
 class UsesRelPreconnectAudit extends Audit{
 
 
@@ -8586,10 +9167,8 @@
 static get meta(){
 return{
 id:'uses-rel-preconnect',
-title:'Avoid multiple, costly round trips to any origin',
-description:
-'Consider adding preconnect or dns-prefetch resource hints to establish early '+
-`connections to important third-party origins. [Learn more](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect).`,
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 requiredArtifacts:['devtoolsLogs','URL'],
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};
 
@@ -8715,15 +9294,18 @@
 
 
 const headings=[
-{key:'url',valueType:'url',label:'Origin'},
-{key:'wastedMs',valueType:'timespanMs',label:'Potential Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
+
 
 const details=Audit.makeOpportunityDetails(headings,results,maxWasted);
 
 return{
 score:UnusedBytes.scoreForWastedMs(maxWasted),
 rawValue:maxWasted,
-displayValue:['Potential savings of %10d\xa0ms',maxWasted],
+displayValue:maxWasted?
+str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:maxWasted}):
+'',
 extendedInfo:{
 value:results},
 
@@ -8733,8 +9315,11 @@
 
 
 module.exports=UsesRelPreconnectAudit;
+module.exports.UIStrings=UIStrings;
 
-},{"./audit":2,"./byte-efficiency/byte-efficiency-audit":3}],"../audits/uses-rel-preload":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/uses-rel-preconnect.js");
+},{"../lib/i18n/i18n.js":36,"./audit":2,"./byte-efficiency/byte-efficiency-audit":3}],"../audits/uses-rel-preload":[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -8745,6 +9330,19 @@
 const URL=require('../lib/url-shim');
 const Audit=require('./audit');
 const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit');
+const CriticalRequestChains=require('../gather/computed/critical-request-chains');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+title:'Preload key requests',
+
+description:'Consider using <link rel=preload> to prioritize fetching resources that are '+
+'currently requested later in page load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/preload).'};
+
+
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+
 const THRESHOLD_IN_MS=100;
 
 class UsesRelPreloadAudit extends Audit{
@@ -8754,9 +9352,8 @@
 static get meta(){
 return{
 id:'uses-rel-preload',
-title:'Preload key requests',
-description:'Consider using <link rel=preload> to prioritize fetching late-discovered '+
-'resources sooner. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/preload).',
+title:str_(UIStrings.title),
+description:str_(UIStrings.description),
 requiredArtifacts:['devtoolsLogs','traces','URL'],
 scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};
 
@@ -8767,32 +9364,19 @@
 
 
 
-static _flattenRequests(chains,maxLevel,minLevel=0){
+static getURLsToPreload(mainResource,graph){
 
-const requests=[];
+const urls=new Set();
 
+graph.traverse((node,traversalPath)=>{
+if(node.type!=='network')return;
 
-
-
-
-const flatten=(chains,level)=>{
-Object.keys(chains).forEach(chain=>{
-if(chains[chain]){
-const currentChain=chains[chain];
-if(level>=minLevel){
-requests.push(currentChain.request);
-}
-
-if(level<maxLevel){
-flatten(currentChain.children,level+1);
-}
-}
+const path=traversalPath.slice(1).filter(initiator=>initiator.type==='network');
+if(!UsesRelPreloadAudit.shouldPreloadRequest(node.record,mainResource,path))return;
+urls.add(node.record.url);
 });
-};
 
-flatten(chains,0);
-
-return requests;
+return urls;
 }
 
 
@@ -8801,10 +9385,23 @@
 
 
 
-static shouldPreload(request,mainResource){
-if(request.isLinkPreload||URL.NON_NETWORK_PROTOCOLS.includes(request.protocol)){
-return false;
-}
+
+
+
+
+
+
+static shouldPreloadRequest(request,mainResource,initiatorPath){
+const mainResourceDepth=mainResource.redirects?mainResource.redirects.length:0;
+
+
+if(request.isLinkPreload)return false;
+
+if(!CriticalRequestChains.isCritical(request,mainResource))return false;
+
+if(URL.NON_NETWORK_PROTOCOLS.includes(request.protocol))return false;
+
+if(initiatorPath.length!==mainResourceDepth+2)return false;
 
 return URL.rootDomainsMatch(request.url,mainResource.url);
 }
@@ -8894,43 +9491,30 @@
 const URL=artifacts.URL;
 const simulatorOptions={trace,devtoolsLog,settings:context.settings};
 
-const[critChains,mainResource,graph,simulator]=await Promise.all([
-
-artifacts.requestCriticalRequestChains({devtoolsLog,URL}),
+const[mainResource,graph,simulator]=await Promise.all([
 artifacts.requestMainResource({devtoolsLog,URL}),
 artifacts.requestPageDependencyGraph({trace,devtoolsLog}),
 artifacts.requestLoadSimulator(simulatorOptions)]);
 
 
-
-const mainResourceIndex=mainResource.redirects?mainResource.redirects.length:0;
-
-const criticalRequests=UsesRelPreloadAudit._flattenRequests(critChains,
-3+mainResourceIndex,2+mainResourceIndex);
-
-
-const urls=new Set();
-for(const networkRecord of criticalRequests){
-if(UsesRelPreloadAudit.shouldPreload(networkRecord,mainResource)){
-urls.add(networkRecord.url);
-}
-}
-
+const urls=UsesRelPreloadAudit.getURLsToPreload(mainResource,graph);
 const{results,wastedMs}=UsesRelPreloadAudit.computeWasteWithGraph(urls,graph,simulator);
 
 results.sort((a,b)=>b.wastedMs-a.wastedMs);
 
 
 const headings=[
-{key:'url',valueType:'url',label:'URL'},
-{key:'wastedMs',valueType:'timespanMs',label:'Potential Savings'}];
+{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
 
 const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
 
 return{
 score:UnusedBytes.scoreForWastedMs(wastedMs),
 rawValue:wastedMs,
-displayValue:['Potential savings of %10d\xa0ms',wastedMs],
+displayValue:wastedMs?
+str_(i18n.UIStrings.displayValueMsSavings,{wastedMs}):
+'',
 extendedInfo:{
 value:results},
 
@@ -8940,8 +9524,10 @@
 
 
 module.exports=UsesRelPreloadAudit;
+module.exports.UIStrings=UIStrings;
 
-},{"../lib/url-shim":"url","./audit":2,"./byte-efficiency/byte-efficiency-audit":3}],"../audits/viewport":[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/uses-rel-preload.js");
+},{"../gather/computed/critical-request-chains":"./gather/computed/critical-request-chains","../lib/i18n/i18n.js":36,"../lib/url-shim":"url","./audit":2,"./byte-efficiency/byte-efficiency-audit":3}],"../audits/viewport":[function(require,module,exports){
 
 
 
@@ -9002,7 +9588,7 @@
 
 module.exports=Viewport;
 
-},{"./audit":2,"metaviewport-parser":127}],"../audits/webapp-install-banner":[function(require,module,exports){
+},{"./audit":2,"metaviewport-parser":180}],"../audits/webapp-install-banner":[function(require,module,exports){
 
 
 
@@ -9012,6 +9598,7 @@
 
 const MultiCheckAudit=require('./multi-check-audit');
 const SWAudit=require('./service-worker');
+const ManifestValues=require('../gather/computed/manifest-values');
 
 
 
@@ -9109,14 +9696,13 @@
 
 if(!hasOfflineStartUrl){
 failures.push('Service worker does not successfully serve the manifest\'s start_url');
-
-if(artifacts.StartUrl.debugString){
-failures.push(artifacts.StartUrl.debugString);
+if(artifacts.StartUrl.explanation){
+failures.push(artifacts.StartUrl.explanation);
 }
 }
 
-if(artifacts.StartUrl.debugString){
-warnings.push(artifacts.StartUrl.debugString);
+if(artifacts.StartUrl.explanation){
+warnings.push(artifacts.StartUrl.explanation);
 }
 
 return{failures,warnings};
@@ -9126,13 +9712,14 @@
 
 
 
-static audit_(artifacts){
+
+static async audit_(artifacts,context){
 
 let offlineFailures=[];
 
 let offlineWarnings=[];
 
-return artifacts.requestManifestValues(artifacts.Manifest).then(manifestValues=>{
+const manifestValues=await ManifestValues.request(context,artifacts.Manifest);
 const manifestFailures=WebappInstallBanner.assessManifest(manifestValues);
 const swFailures=WebappInstallBanner.assessServiceWorker(artifacts);
 if(!swFailures.length){
@@ -9150,13 +9737,12 @@
 
 manifestValues};
 
-});
 }}
 
 
 module.exports=WebappInstallBanner;
 
-},{"./multi-check-audit":5,"./service-worker":"../audits/service-worker"}],"../audits/without-javascript":[function(require,module,exports){
+},{"../gather/computed/manifest-values":12,"./multi-check-audit":5,"./service-worker":"../audits/service-worker"}],"../audits/without-javascript":[function(require,module,exports){
 
 
 
@@ -9268,6 +9854,7 @@
 const Gatherer=require('./gatherer');
 
 const axeLibSource="/*! aXe v3.0.0-beta.2\n * Copyright (c) 2018 Deque Systems, Inc.\n *\n * Your use of this Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * This entire copyright notice must appear in every copy of this file you\n * distribute or in any file that contains substantial portions of this source\n * code.\n */\n!function a(window){function b(a){this.name=\"SupportError\",this.cause=a.cause,this.message=\"`\"+a.cause+\"` - feature unsupported in your environment.\",a.ruleId&&(this.ruleId=a.ruleId,this.message+=\" Skipping \"+this.ruleId+\" rule.\"),this.stack=(new Error).stack}function c(a){\"use strict\";var b;return a?(b=axe.utils.clone(a),b.commons=a.commons):b={},b.reporter=b.reporter||null,b.rules=b.rules||[],b.checks=b.checks||[],b.data=Object.assign({checks:{},rules:{}},b.data),b}function d(a,b,c){\"use strict\";var d,e;for(d=0,e=a.length;d<e;d++)b[c](a[d])}function e(a){this.brand=\"axe\",this.application=\"axeAPI\",this.tagExclude=[\"experimental\"],this.defaultConfig=a,this._init()}function f(a,b,c){var d=a.brand,e=a.application;return axe.constants.helpUrlBase+d+\"/\"+(c||axe.version.substring(0,axe.version.lastIndexOf(\".\")))+\"/\"+b+\"?application=\"+e}function g(a){\"use strict\";this.id=a.id,this.data=null,this.relatedNodes=[],this.result=null}function h(a){\"use strict\";return\"string\"==typeof a?new Function(\"return \"+a+\";\")():a}function i(a){a&&(this.id=a.id,this.configure(a))}function j(a,b){\"use strict\";if(!axe.utils.isHidden(b)){axe.utils.findBy(a,\"node\",b)||a.push({node:b,include:[],exclude:[]})}}function k(a,b,c){\"use strict\";a.frames=a.frames||[];var d,e,f=document.querySelectorAll(c.shift());a:for(var g=0,h=f.length;g<h;g++){e=f[g];for(var i=0,j=a.frames.length;i<j;i++)if(a.frames[i].node===e){a.frames[i][b].push(c);break a}d={node:e,include:[],exclude:[]},c&&d[b].push(c),a.frames.push(d)}}function l(a){\"use strict\";if(a&&\"object\"===(void 0===a?\"undefined\":za(a))||a instanceof NodeList){if(a instanceof Node)return{include:[a],exclude:[]};if(a.hasOwnProperty(\"include\")||a.hasOwnProperty(\"exclude\"))return{include:a.include&&+a.include.length?a.include:[document],exclude:a.exclude||[]};if(a.length===+a.length)return{include:a,exclude:[]}}return\"string\"==typeof a?{include:[a],exclude:[]}:{include:[document],exclude:[]}}function m(a,b){\"use strict\";for(var c,d,e=[],f=0,g=a[b].length;f<g;f++){if(\"string\"==typeof(c=a[b][f])){d=Array.from(document.querySelectorAll(c)),e=e.concat(d.map(function(a){return axe.utils.getFlattenedTree(a)[0]}));break}!c||!c.length||c instanceof Node?c instanceof Node&&e.push(axe.utils.getFlattenedTree(c)[0]):c.length>1?k(a,b,c):(d=Array.from(document.querySelectorAll(c[0])),e=e.concat(d.map(function(a){return axe.utils.getFlattenedTree(a)[0]})))}return e.filter(function(a){return a})}function n(a){\"use strict\";if(0===a.include.length){if(0===a.frames.length){var b=axe.utils.respondable.isInFrame()?\"frame\":\"page\";return new Error(\"No elements found for include in \"+b+\" Context\")}a.frames.forEach(function(a,b){if(0===a.include.length)return new Error(\"No elements found for include in Context of frame \"+b)})}}function o(a){\"use strict\";var b=this;this.frames=[],this.initiator=!a||\"boolean\"!=typeof a.initiator||a.initiator,this.page=!1,a=l(a),this.exclude=a.exclude,this.include=a.include,this.include=m(this,\"include\"),this.exclude=m(this,\"exclude\"),axe.utils.select(\"frame, iframe\",this).forEach(function(a){wa(a,b)&&j(b.frames,a.actualNode)}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var c=n(this);if(c instanceof Error)throw c;Array.isArray(this.include)||(this.include=Array.from(this.include)),this.include.sort(axe.utils.nodeSorter)}function p(a){\"use strict\";this.id=a.id,this.result=axe.constants.NA,this.pageLevel=a.pageLevel,this.impact=null,this.nodes=[]}function q(a,b){\"use strict\";this._audit=b,this.id=a.id,this.selector=a.selector||\"*\",this.excludeHidden=\"boolean\"!=typeof a.excludeHidden||a.excludeHidden,this.enabled=\"boolean\"!=typeof a.enabled||a.enabled,this.pageLevel=\"boolean\"==typeof a.pageLevel&&a.pageLevel,this.any=a.any||[],this.all=a.all||[],this.none=a.none||[],this.tags=a.tags||[],a.matches&&(this.matches=h(a.matches))}function r(a){\"use strict\";return axe.utils.getAllChecks(a).map(function(b){var c=a._audit.checks[b.id||b];return c&&\"function\"==typeof c.after?c:null}).filter(Boolean)}function s(a,b){\"use strict\";var c=[];return a.forEach(function(a){axe.utils.getAllChecks(a).forEach(function(a){a.id===b&&c.push(a)})}),c}function t(a){\"use strict\";return a.filter(function(a){return!0!==a.filtered})}function u(a){\"use strict\";var b=[\"any\",\"all\",\"none\"],c=a.nodes.filter(function(a){var c=0;return b.forEach(function(b){a[b]=t(a[b]),c+=a[b].length}),c>0});return a.pageLevel&&c.length&&(c=[c.reduce(function(a,c){if(a)return b.forEach(function(b){a[b].push.apply(a[b],c[b])}),a})]),c}function v(a,b){\"use strict\";if(a=a||function(){},b=b||axe.log,!axe._audit)throw new Error(\"No audit configured\");var c=axe.utils.queue(),d=[];Object.keys(axe.plugins).forEach(function(a){c.defer(function(b){var c=function(a){d.push(a),b()};try{axe.plugins[a].cleanup(b,c)}catch(a){c(a)}})});var e=axe.utils.getFlattenedTree(document.body);axe.utils.querySelectorAll(e,\"iframe, frame\").forEach(function(a){c.defer(function(b,c){return axe.utils.sendCommandToFrame(a.actualNode,{command:\"cleanup-plugin\"},b,c)})}),c.then(function(c){0===d.length?a(c):b(d)}).catch(b)}function w(a){\"use strict\";var b;if(!(b=axe._audit))throw new Error(\"No audit configured\");a.reporter&&(\"function\"==typeof a.reporter||Ca[a.reporter])&&(b.reporter=a.reporter),a.checks&&a.checks.forEach(function(a){b.addCheck(a)});var c=[];a.rules&&a.rules.forEach(function(a){c.push(a.id),b.addRule(a)}),a.disableOtherRules&&b.rules.forEach(function(a){!1===c.includes(a.id)&&(a.enabled=!1)}),void 0!==a.branding?b.setBranding(a.branding):b._constructHelpUrls(),a.tagExclude&&(b.tagExclude=a.tagExclude)}function x(a,b,c){\"use strict\";var d=c,e=function(a){a instanceof Error==!1&&(a=new Error(a)),c(a)},f=a&&a.context||{};f.hasOwnProperty(\"include\")&&!f.include.length&&(f.include=[document]);var g=a&&a.options||{};switch(a.command){case\"rules\":return A(f,g,d,e);case\"cleanup-plugin\":return v(d,e);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[a.command])return axe._audit.commands[a.command](a,c)}}function y(a){\"use strict\";this._run=a.run,this._collect=a.collect,this._registry={},a.commands.forEach(function(a){axe._audit.registerCommand(a)})}function z(){\"use strict\";var a=axe._audit;if(!a)throw new Error(\"No audit configured\");a.resetRulesAndChecks()}function A(a,b,c,d){\"use strict\";try{a=new o(a)}catch(a){return d(a)}var e=axe.utils.queue(),f=axe._audit;b.performanceTimer&&axe.utils.performanceTimer.auditStart(),a.frames.length&&!1!==b.iframes&&e.defer(function(c,d){axe.utils.collectResultsFromFrames(a,b,\"rules\",null,c,d)});var g=void 0;e.defer(function(c,d){b.restoreScroll&&(g=axe.utils.getScrollState()),f.run(a,b,c,d)}),e.then(function(e){try{g&&axe.utils.setScrollState(g),b.performanceTimer&&axe.utils.performanceTimer.auditEnd();var h=axe.utils.mergeResults(e.map(function(a){return{results:a}}));a.initiator&&(h=f.after(h,b),h.forEach(axe.utils.publishMetaData),h=h.map(axe.utils.finalizeRuleResult));try{c(h)}catch(a){axe.log(a)}}catch(a){d(a)}}).catch(d)}function B(a){\"use strict\";switch(!0){case\"string\"==typeof a:case Array.isArray(a):case Node&&a instanceof Node:case NodeList&&a instanceof NodeList:return!0;case\"object\"!==(void 0===a?\"undefined\":za(a)):return!1;case void 0!==a.include:case void 0!==a.exclude:case\"number\"==typeof a.length:return!0;default:return!1}}function C(a,b,c){\"use strict\";var d=new TypeError(\"axe.run arguments are invalid\");if(!B(a)){if(void 0!==c)throw d;c=b,b=a,a=document}if(\"object\"!==(void 0===b?\"undefined\":za(b))){if(void 0!==c)throw d;c=b,b={}}if(\"function\"!=typeof c&&void 0!==c)throw d;return{context:a,options:b,callback:c||Da}}function D(a,b){\"use strict\";[\"any\",\"all\",\"none\"].forEach(function(c){Array.isArray(a[c])&&a[c].filter(function(a){return Array.isArray(a.relatedNodes)}).forEach(function(a){a.relatedNodes=a.relatedNodes.map(function(a){var c={html:a.source};return b.elementRef&&!a.fromFrame&&(c.element=a.element),(!1!==b.selectors||a.fromFrame)&&(c.target=a.selector),b.xpath&&(c.xpath=a.xpath),c})})})}function E(a,b){return Ja.reduce(function(c,d){return c[d]=(a[d]||[]).map(function(a){return b(a,d)}),c},{})}function F(a,b,c){var d=Object.assign({},b);d.nodes=(d[c]||[]).concat(),axe.constants.resultGroups.forEach(function(a){delete d[a]}),a[c].push(d)}function G(a,b,c){\"use strict\";var d=window.getComputedStyle(a,null),e=!1;return!!d&&(b.forEach(function(a){d.getPropertyValue(a.property)===a.value&&(e=!0)}),!!e||!(a.nodeName.toUpperCase()===c.toUpperCase()||!a.parentNode)&&G(a.parentNode,b,c))}function H(a,b){\"use strict\";var c;return axe._tree&&(c=axe.utils.getSelector(b)),new Error(a+\": \"+(c||b))}function I(a,b,c,d,e,f){\"use strict\";var g=axe.utils.queue();a.frames.forEach(function(e){var f={options:b,command:c,parameter:d,context:{initiator:!1,page:a.page,include:e.include||[],exclude:e.exclude||[]}};g.defer(function(a,b){var c=e.node;axe.utils.sendCommandToFrame(c,f,function(b){if(b)return a({results:b,frameElement:c,frame:axe.utils.getSelector(c)});a(null)},b)})}),g.then(function(a){e(axe.utils.mergeResults(a,b))}).catch(f)}function J(a,b){if(b=b||300,a.length>b){var c=a.indexOf(\">\");a=a.substring(0,c+1)}return a}function K(a){var b=a.outerHTML;return b||\"function\"!=typeof XMLSerializer||(b=(new XMLSerializer).serializeToString(a)),J(b||\"\")}function L(a,b,c){this._fromFrame=!!c,this.spec=c||{},b&&b.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:K(a),this._element=a}function M(a,b){return{shadowId:b,children:[],actualNode:a}}function N(a){var b=[];for(a=a.firstChild;a;)b.push(a),a=a.nextSibling;return b}function O(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\";return 0!==a.length&&(a.match(/[0-9]/g)||\"\").length>=a.length/2}function P(a,b){return[a.substring(0,b),a.substring(b)]}function Q(a){var b=a,c=\"\",d=\"\",e=\"\",f=\"\",g=\"\",h=\"\";if(a.includes(\"#\")){var i=P(a,a.indexOf(\"#\")),j=Ka(i,2);a=j[0],h=j[1]}if(a.includes(\"?\")){var k=P(a,a.indexOf(\"?\")),l=Ka(k,2);a=l[0],g=l[1]}if(a.includes(\"://\")){var m=a.split(\"://\"),n=Ka(m,2);c=n[0],a=n[1];var o=P(a,a.indexOf(\"/\")),p=Ka(o,2);d=p[0],a=p[1]}else if(\"//\"===a.substr(0,2)){a=a.substr(2);var q=P(a,a.indexOf(\"/\")),r=Ka(q,2);d=r[0],a=r[1]}if(\"www.\"===d.substr(0,4)&&(d=d.substr(4)),d&&d.includes(\":\")){var s=P(d,d.indexOf(\":\")),t=Ka(s,2);d=t[0],e=t[1]}return f=a,{original:b,protocol:c,domain:d,port:e,path:f,query:g,hash:h}}function R(a,b){var c=b.name,d=void 0;if(-1!==c.indexOf(\"href\")||-1!==c.indexOf(\"src\")){var e=encodeURI(axe.utils.getFriendlyUriEnd(a.getAttribute(c)));if(!e)return;d=La(b.name)+'$=\"'+e+'\"'}else d=La(c)+'=\"'+La(b.value)+'\"';return d}function S(a,b){return a.count<b.count?-1:a.count===b.count?0:1}function T(a){return!Na.includes(a.name)&&-1===a.name.indexOf(\":\")&&(!a.value||a.value.length<Oa)}function U(a,b){var c=[],d=b.classes,e=b.tags;return a.classList&&Array.from(a.classList).forEach(function(b){var f=La(b);d[f]<e[a.nodeName]&&c.push({name:f,count:d[f],species:\"class\"})}),c.sort(S)}function V(a,b){var c=a.parentNode&&Array.from(a.parentNode.children||\"\")||[];if(c.find(function(c){return c!==a&&axe.utils.matchesSelector(c,b)}))return\":nth-child(\"+(1+c.indexOf(a))+\")\";return\"\"}function W(a){if(a.getAttribute(\"id\")){var b=a.getRootNode&&a.getRootNode()||document,c=\"#\"+La(a.getAttribute(\"id\")||\"\");return c.match(/player_uid_/)||1!==b.querySelectorAll(c).length?void 0:c}}function X(a){return void 0===Ma&&(Ma=axe.utils.isXHTML(document)),La(Ma?a.localName:a.nodeName.toLowerCase())}function Y(a,b){var c=[],d=b.attributes,e=b.tags;return a.attributes&&Array.from(a.attributes).filter(T).forEach(function(b){var f=R(a,b);f&&d[f]<e[a.nodeName]&&c.push({name:f,count:d[f],species:\"attribute\"})}),c.sort(S)}function Z(a,b){var c=\"\",d=void 0,e=U(a,b),f=Y(a,b);return e.length&&1===e[0].count?d=[e[0]]:f.length&&1===f[0].count?(d=[f[0]],c=X(a)):(d=e.concat(f),d.sort(S),d=d.slice(0,3),d.some(function(a){return\"class\"===a.species})?d.sort(function(a,b){return a.species!==b.species&&\"class\"===a.species?-1:a.species===b.species?0:1}):c=X(a)),c+=d.reduce(function(a,b){switch(b.species){case\"class\":return a+\".\"+b.name;case\"attribute\":return a+\"[\"+b.name+\"]\"}return a},\"\")}function $(a,b,c){axe._selectorData||(axe._selectorData=axe.utils.getSelectorData(axe._tree));var d=b.toRoot,e=void 0!==d&&d,f=void 0,g=void 0;do{var h=W(a);h||(h=Z(a,axe._selectorData),h+=V(a,h)),f=f?h+\" > \"+f:h,g=g?g.filter(function(a){return axe.utils.matchesSelector(a,f)}):Array.from(c.querySelectorAll(f)),a=a.parentElement}while((g.length>1||e)&&a&&11!==a.nodeType);return 1===g.length?f:-1!==f.indexOf(\" > \")?\":root\"+f.substring(f.indexOf(\" > \")):\":root\"}function _(a,b){var c,d;if(!a)return[];if(!b&&9===a.nodeType)return b=[{str:\"html\"}];if(b=b||[],a.parentNode&&a.parentNode!==a&&(b=_(a.parentNode,b)),a.previousSibling){d=1,c=a.previousSibling;do{1===c.nodeType&&c.nodeName===a.nodeName&&d++,c=c.previousSibling}while(c);1===d&&(d=null)}else if(a.nextSibling){c=a.nextSibling;do{1===c.nodeType&&c.nodeName===a.nodeName?(d=1,c=null):(d=null,c=c.previousSibling)}while(c)}if(1===a.nodeType){var e={};e.str=a.nodeName.toLowerCase();var f=a.getAttribute&&axe.utils.escapeSelector(a.getAttribute(\"id\"));f&&1===a.ownerDocument.querySelectorAll(\"#\"+f).length&&(e.id=a.getAttribute(\"id\")),d>1&&(e.count=d),b.push(e)}return b}function aa(a){return a.reduce(function(a,b){return b.id?\"/\"+b.str+\"[@id='\"+b.id+\"']\":a+\"/\"+b.str+(b.count>0?\"[\"+b.count+\"]\":\"\")},\"\")}function ba(a){\"use strict\";if(Pa&&Pa.parentNode)return void 0===Pa.styleSheet?Pa.appendChild(document.createTextNode(a)):Pa.styleSheet.cssText+=a,Pa;if(a){var b=document.head||document.getElementsByTagName(\"head\")[0];return Pa=document.createElement(\"style\"),Pa.type=\"text/css\",void 0===Pa.styleSheet?Pa.appendChild(document.createTextNode(a)):Pa.styleSheet.cssText=a,b.appendChild(Pa),Pa}}function ca(a,b,c,d){\"use strict\";var e=axe.utils.getXpath(c),f={element:c,selector:d,xpath:e};a.forEach(function(a){a.node=axe.utils.DqElement.fromFrame(a.node,b,f);var c=axe.utils.getAllChecks(a);c.length&&c.forEach(function(a){a.relatedNodes=a.relatedNodes.map(function(a){return axe.utils.DqElement.fromFrame(a,b,f)})})})}function da(a,b){\"use strict\";for(var c,d,e=b[0].node,f=0,g=a.length;f<g;f++)if(d=a[f].node,(c=axe.utils.nodeSorter({actualNode:d.element},{actualNode:e.element}))>0||0===c&&e.selector.length<d.selector.length)return void a.splice.apply(a,[f,0].concat(b));a.push.apply(a,b)}function ea(a){\"use strict\";return a&&a.results?Array.isArray(a.results)?a.results.length?a.results:null:[a.results]:null}function fa(a,b){function c(a){return a.incomplete&&a.incomplete.default?a.incomplete.default:Aa.incompleteFallbackMessage()}if(!a||!a.missingData)return c(b);try{var d=b.incomplete[a.missingData[0].reason];if(!d)throw new Error;return d}catch(d){return\"string\"==typeof a.missingData?b.incomplete[a.missingData]:c(b)}}function ga(a,b){\"use strict\";return function(c){var d=a[c.id]||{},e=d.messages||{},f=Object.assign({},d);delete f.messages,void 0===c.result?\"object\"===za(e.incomplete)?f.message=function(){return fa(c.data,e)}:f.message=e.incomplete:f.message=c.result===b?e.pass:e.fail,axe.utils.extendMetaData(c,f)}}function ha(a,b){return 1===a.nodeType&&(\"*\"===b.tag||a.nodeName.toLowerCase()===b.tag)}function ia(a,b){return!b.classes||b.classes.reduce(function(b,c){return b&&a.className&&a.className.match(c.regexp)},!0)}function ja(a,b){return!b.attributes||b.attributes.reduce(function(b,c){var d=a.getAttribute(c.key);return b&&null!==d&&(!c.value||c.test(d))},!0)}function ka(a,b){return!b.id||a.id===b.id}function la(a,b){return!(b.pseudos&&!b.pseudos.reduce(function(b,c){if(\"not\"===c.name)return b&&!Sa([a],c.expressions,!1).length;throw new Error(\"the pseudo selector \"+c.name+\" has not yet been implemented\")},!0))}function ma(a){/*! Credit Mootools Copyright Mootools, MIT License */\nif(a)return a.map(function(a){var b,c,d=a.name.replace(Ua,\"\"),e=(a.value||\"\").replace(Ua,\"\");switch(a.operator){case\"^=\":c=new RegExp(\"^\"+Ta(e));break;case\"$=\":c=new RegExp(Ta(e)+\"$\");break;case\"~=\":c=new RegExp(\"(^|\\\\s)\"+Ta(e)+\"(\\\\s|$)\");break;case\"|=\":c=new RegExp(\"^\"+Ta(e)+\"(-|$)\");break;case\"=\":b=function(a){return e===a};break;case\"*=\":b=function(a){return a&&a.includes(e)};break;case\"!=\":b=function(a){return e!==a};break;default:b=function(a){return!!a}}return\"\"===e&&/^[*$^]=$/.test(a.operator)&&(b=function(){return!1}),b||(b=function(a){return a&&c.test(a)}),{key:d,value:e,test:b}})}function na(a){if(a)return a.map(function(a){return a=a.replace(Ua,\"\"),{value:a,regexp:new RegExp(\"(^|\\\\s)\"+Ta(a)+\"(\\\\s|$)\")}})}function oa(a){if(a)return a.map(function(a){var b;return\"not\"===a.name&&(b=axe.utils.cssParser.parse(a.value),b=b.selectors?b.selectors:[b],b=Ra(b)),{name:a.name,expressions:b,value:a.value}})}function pa(a,b,c,d){var e={nodes:a.slice(),anyLevel:b,thisLevel:c,parentShadowId:d};return e.nodes.reverse(),e}function qa(a,b){return ha(a.actualNode,b[0])&&ia(a.actualNode,b[0])&&ja(a.actualNode,b[0])&&ka(a.actualNode,b[0])&&la(a,b[0])}function ra(a,b){\"use strict\";var c,d,e=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return b.hasOwnProperty(\"include\")||b.hasOwnProperty(\"exclude\")?(c=b.include||[],c=Array.isArray(c)?c:[c],d=b.exclude||[],d=Array.isArray(d)?d:[d],d=d.concat(e.filter(function(a){return-1===c.indexOf(a)}))):(c=Array.isArray(b)?b:[b],d=e.filter(function(a){return-1===c.indexOf(a)})),!!(c.some(function(b){return-1!==a.tags.indexOf(b)})||0===c.length&&!1!==a.enabled)&&d.every(function(b){return-1===a.tags.indexOf(b)})}function sa(a){var b=window.getComputedStyle(a),c=\"visible\"===b.getPropertyValue(\"overflow-y\"),d=\"visible\"===b.getPropertyValue(\"overflow-x\");if(!c&&a.scrollHeight>a.clientHeight||!d&&a.scrollWidth>a.clientWidth)return{elm:a,top:a.scrollTop,left:a.scrollLeft}}function ta(a,b,c){if(a===window)return a.scroll(b,c);a.scrollTop=b,a.scrollLeft=c}function ua(a){return Array.from(a.children).reduce(function(a,b){var c=sa(b);return c&&a.push(c),a.concat(ua(b))},[])}function va(a){\"use strict\";return a.sort(function(a,b){return axe.utils.contains(a,b)?1:-1})[0]}function wa(a,b){\"use strict\";var c=b.include&&va(b.include.filter(function(b){return axe.utils.contains(b,a)})),d=b.exclude&&va(b.exclude.filter(function(b){return axe.utils.contains(b,a)}));return!!(!d&&c||d&&axe.utils.contains(d,c))}function xa(a,b){\"use strict\";var c;if(0===a.length)return b;a.length<b.length&&(c=a,a=b,b=c);for(var d=0,e=b.length;d<e;d++)a.includes(b[d])||a.push(b[d]);return a}function ya(a){return a.reduce(function(a,b){return a.length&&a[a.length-1].actualNode.contains(b.actualNode)||a.push(b),a},[])}var document=window.document,za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a},axe=axe||{};axe.version=\"3.0.0-beta.2\",\"function\"==typeof define&&define.amd&&define([],function(){\"use strict\";return axe}),\"object\"===(\"undefined\"==typeof module?\"undefined\":za(module))&&module.exports&&\"function\"==typeof a.toString&&(axe.source=\"(\"+a.toString()+')(typeof window === \"object\" ? window : this);',module.exports=axe),\"function\"==typeof window.getComputedStyle&&(window.axe=axe);var commons;b.prototype=Object.create(Error.prototype),b.prototype.constructor=b;var utils=axe.utils={},Aa={},za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};e.prototype._init=function(){var a=c(this.defaultConfig);axe.commons=commons=a.commons,this.reporter=a.reporter,this.commands={},this.rules=[],this.checks={},d(a.rules,this,\"addRule\"),d(a.checks,this,\"addCheck\"),this.data={},this.data.checks=a.data&&a.data.checks||{},this.data.rules=a.data&&a.data.rules||{},this.data.failureSummaries=a.data&&a.data.failureSummaries||{},this.data.incompleteFallbackMessage=a.data&&a.data.incompleteFallbackMessage||\"\",this._constructHelpUrls()},e.prototype.registerCommand=function(a){\"use strict\";this.commands[a.id]=a.callback},e.prototype.addRule=function(a){\"use strict\";a.metadata&&(this.data.rules[a.id]=a.metadata);var b=this.getRule(a.id);b?b.configure(a):this.rules.push(new q(a,this))},e.prototype.addCheck=function(a){\"use strict\";var b=a.metadata;\"object\"===(void 0===b?\"undefined\":za(b))&&(this.data.checks[a.id]=b,\"object\"===za(b.messages)&&Object.keys(b.messages).filter(function(a){return b.messages.hasOwnProperty(a)&&\"string\"==typeof b.messages[a]}).forEach(function(a){0===b.messages[a].indexOf(\"function\")&&(b.messages[a]=new Function(\"return \"+b.messages[a]+\";\")())})),this.checks[a.id]?this.checks[a.id].configure(a):this.checks[a.id]=new i(a)},e.prototype.run=function(a,b,c,d){\"use strict\";this.validateOptions(b),axe._tree=axe.utils.getFlattenedTree(document.documentElement),axe._selectCache=[];var e=axe.utils.queue();this.rules.forEach(function(c){if(axe.utils.ruleShouldRun(c,a,b)){if(b.performanceTimer){var d=\"mark_rule_end_\"+c.id,f=\"mark_rule_start_\"+c.id;axe.utils.performanceTimer.mark(f)}e.defer(function(e,g){c.run(a,b,function(a){b.performanceTimer&&(axe.utils.performanceTimer.mark(d),axe.utils.performanceTimer.measure(\"rule_\"+c.id,f,d)),e(a)},function(a){if(b.debug)g(a);else{var d=Object.assign(new p(c),{result:axe.constants.CANTTELL,description:\"An error occured while running this rule\",message:a.message,stack:a.stack,error:a});e(d)}})})}}),e.then(function(a){axe._selectCache=void 0,c(a.filter(function(a){return!!a}))}).catch(d)},e.prototype.after=function(a,b){\"use strict\";var c=this.rules;return a.map(function(a){return axe.utils.findBy(c,\"id\",a.id).after(a,b)})},e.prototype.getRule=function(a){return this.rules.find(function(b){return b.id===a})},e.prototype.validateOptions=function(a){\"use strict\";var b=this;if(\"object\"===za(a.runOnly)){var c=a.runOnly;if(\"rule\"===c.type&&Array.isArray(c.value))c.value.forEach(function(a){if(!b.getRule(a))throw new Error(\"unknown rule `\"+a+\"` in options.runOnly\")});else if(Array.isArray(c.value)&&c.value.length>0){var d=[].concat(c.value);if(b.rules.forEach(function(a){var b,c,e;if(d)for(c=0,e=a.tags.length;c<e;c++)-1!==(b=d.indexOf(a.tags[c]))&&d.splice(b,1)}),0!==d.length)throw new Error(\"could not find tags `\"+d.join(\"`, `\")+\"`\")}}return\"object\"===za(a.rules)&&Object.keys(a.rules).forEach(function(a){if(!b.getRule(a))throw new Error(\"unknown rule `\"+a+\"` in options.rules\")}),a},e.prototype.setBranding=function(a){\"use strict\";var b={brand:this.brand,application:this.application};a&&a.hasOwnProperty(\"brand\")&&a.brand&&\"string\"==typeof a.brand&&(this.brand=a.brand),a&&a.hasOwnProperty(\"application\")&&a.application&&\"string\"==typeof a.application&&(this.application=a.application),this._constructHelpUrls(b)},e.prototype._constructHelpUrls=function(){var a=this,b=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,c=(axe.version.match(/^[1-9][0-9]*\\.[0-9]+/)||[\"x.y\"])[0];this.rules.forEach(function(d){a.data.rules[d.id]||(a.data.rules[d.id]={});var e=a.data.rules[d.id];(\"string\"!=typeof e.helpUrl||b&&e.helpUrl===f(b,d.id,c))&&(e.helpUrl=f(a,d.id,c))})},e.prototype.resetRulesAndChecks=function(){\"use strict\";this._init()},i.prototype.enabled=!0,i.prototype.run=function(a,b,c,d){\"use strict\";b=b||{};var e=b.hasOwnProperty(\"enabled\")?b.enabled:this.enabled,f=b.options||this.options;if(e){var h,i=new g(this),j=axe.utils.checkHelper(i,b,c,d);try{h=this.evaluate.call(j,a.actualNode,f,a)}catch(a){return void d(a)}j.isAsync||(i.result=h,setTimeout(function(){c(i)},0))}else c(null)},i.prototype.configure=function(a){var b=this;[\"options\",\"enabled\"].filter(function(b){return a.hasOwnProperty(b)}).forEach(function(c){return b[c]=a[c]}),[\"evaluate\",\"after\"].filter(function(b){return a.hasOwnProperty(b)}).forEach(function(c){return b[c]=h(a[c])})};var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};q.prototype.matches=function(){\"use strict\";return!0},q.prototype.gather=function(a){\"use strict\";var b=axe.utils.select(this.selector,a);return this.excludeHidden?b.filter(function(a){return!axe.utils.isHidden(a.actualNode)}):b},q.prototype.runChecks=function(a,b,c,d,e){\"use strict\";var f=this,g=axe.utils.queue();this[a].forEach(function(a){var d=f._audit.checks[a.id||a],e=axe.utils.getCheckOption(d,f.id,c);g.defer(function(a,c){d.run(b,e,a,c)})}),g.then(function(b){b=b.filter(function(a){return a}),d({type:a,results:b})}).catch(e)},q.prototype.run=function(a,c,d,e){var f=this,g=axe.utils.queue(),h=new p(this),i=\"mark_runchecks_start_\"+this.id,j=\"mark_runchecks_end_\"+this.id,k=void 0;try{k=this.gather(a).filter(function(a){return f.matches(a.actualNode,a)})}catch(a){return void e(new b({cause:a,ruleId:this.id}))}c.performanceTimer&&(axe.log(\"gather (\",k.length,\"):\",axe.utils.performanceTimer.timeElapsed()+\"ms\"),axe.utils.performanceTimer.mark(i)),k.forEach(function(a){g.defer(function(b,d){var e=axe.utils.queue();e.defer(function(b,d){f.runChecks(\"any\",a,c,b,d)}),e.defer(function(b,d){f.runChecks(\"all\",a,c,b,d)}),e.defer(function(b,d){f.runChecks(\"none\",a,c,b,d)}),e.then(function(d){if(d.length){var e=!1,f={};d.forEach(function(a){var b=a.results.filter(function(a){return a});f[a.type]=b,b.length&&(e=!0)}),e&&(f.node=new axe.utils.DqElement(a.actualNode,c),h.nodes.push(f))}b()}).catch(function(a){return d(a)})})}),c.performanceTimer&&(axe.utils.performanceTimer.mark(j),axe.utils.performanceTimer.measure(\"runchecks_\"+this.id,i,j)),g.then(function(){return d(h)}).catch(function(a){return e(a)})},q.prototype.after=function(a,b){\"use strict\";var c=r(this),d=this.id;return c.forEach(function(c){var e=s(a.nodes,c.id),f=axe.utils.getCheckOption(c,d,b),g=c.after(e,f);e.forEach(function(a){-1===g.indexOf(a)&&(a.filtered=!0)})}),a.nodes=u(a),a},q.prototype.configure=function(a){\"use strict\";a.hasOwnProperty(\"selector\")&&(this.selector=a.selector),a.hasOwnProperty(\"excludeHidden\")&&(this.excludeHidden=\"boolean\"!=typeof a.excludeHidden||a.excludeHidden),a.hasOwnProperty(\"enabled\")&&(this.enabled=\"boolean\"!=typeof a.enabled||a.enabled),a.hasOwnProperty(\"pageLevel\")&&(this.pageLevel=\"boolean\"==typeof a.pageLevel&&a.pageLevel),a.hasOwnProperty(\"any\")&&(this.any=a.any),a.hasOwnProperty(\"all\")&&(this.all=a.all),a.hasOwnProperty(\"none\")&&(this.none=a.none),a.hasOwnProperty(\"tags\")&&(this.tags=a.tags),a.hasOwnProperty(\"matches\")&&(\"string\"==typeof a.matches?this.matches=new Function(\"return \"+a.matches+\";\")():this.matches=a.matches)},function(axe){var a=[{name:\"NA\",value:\"inapplicable\",priority:0,group:\"inapplicable\"},{name:\"PASS\",value:\"passed\",priority:1,group:\"passes\"},{name:\"CANTTELL\",value:\"cantTell\",priority:2,group:\"incomplete\"},{name:\"FAIL\",value:\"failed\",priority:3,group:\"violations\"}],b={helpUrlBase:\"https://dequeuniversity.com/rules/\",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze([\"minor\",\"moderate\",\"serious\",\"critical\"])};a.forEach(function(a){var c=a.name,d=a.value,e=a.priority,f=a.group;b[c]=d,b[c+\"_PRIO\"]=e,b[c+\"_GROUP\"]=f,b.results[e]=d,b.resultGroups[e]=f,b.resultGroupMap[d]=f}),Object.freeze(b.results),Object.freeze(b.resultGroups),Object.freeze(b.resultGroupMap),Object.freeze(b),Object.defineProperty(axe,\"constants\",{value:b,enumerable:!0,configurable:!1,writable:!1})}(axe);var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};axe.log=function(){\"use strict\";\"object\"===(\"undefined\"==typeof console?\"undefined\":za(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},axe.cleanup=v,axe.configure=w,axe.getRules=function(a){\"use strict\";a=a||[];var b=a.length?axe._audit.rules.filter(function(b){return!!a.filter(function(a){return-1!==b.tags.indexOf(a)}).length}):axe._audit.rules,c=axe._audit.data.rules||{};return b.map(function(a){var b=c[a.id]||{};return{ruleId:a.id,description:b.description,help:b.help,helpUrl:b.helpUrl,tags:a.tags}})},axe._load=function(a){\"use strict\";axe.utils.respondable.subscribe(\"axe.ping\",function(a,b,c){c({axe:!0})}),axe.utils.respondable.subscribe(\"axe.start\",x),axe._audit=new e(a)};var axe=axe||{};axe.plugins={},y.prototype.run=function(){\"use strict\";return this._run.apply(this,arguments)},y.prototype.collect=function(){\"use strict\";return this._collect.apply(this,arguments)},y.prototype.cleanup=function(a){\"use strict\";var b=axe.utils.queue(),c=this;Object.keys(this._registry).forEach(function(a){b.defer(function(b){c._registry[a].cleanup(b)})}),b.then(function(){a()})},y.prototype.add=function(a){\"use strict\";this._registry[a.id]=a},axe.registerPlugin=function(a){\"use strict\";axe.plugins[a.id]=new y(a)};var Ba,Ca={};axe.getReporter=function(a){\"use strict\";return\"string\"==typeof a&&Ca[a]?Ca[a]:\"function\"==typeof a?a:Ba},axe.addReporter=function(a,b,c){\"use strict\";Ca[a]=b,c&&(Ba=b)},axe.reset=z,axe._runRules=A;var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a},Da=function(){};axe.run=function(a,b,c){\"use strict\";if(!axe._audit)throw new Error(\"No audit configured\");var d=C(a,b,c);a=d.context,b=d.options,c=d.callback,b.reporter=b.reporter||axe._audit.reporter||\"v1\",b.performanceTimer&&axe.utils.performanceTimer.start();var e=void 0,f=Da,g=Da;return window.Promise&&c===Da&&(e=new Promise(function(a,b){f=b,g=a})),axe._runRules(a,b,function(a){var d=function(a){try{c(null,a)}catch(a){axe.log(a)}g(a)};b.performanceTimer&&axe.utils.performanceTimer.end();try{var e=axe.getReporter(b.reporter),h=e(a,b,d);axe._selectorData=void 0,axe._tree=void 0,void 0!==h&&d(h)}catch(a){c(a),f(a)}},function(a){c(a),f(a)}),e},Aa.failureSummary=function(a){\"use strict\";var b={};return b.none=a.none.concat(a.all),b.any=a.any,Object.keys(b).map(function(a){if(b[a].length){var c=axe._audit.data.failureSummaries[a];return c&&\"function\"==typeof c.failureMessage?c.failureMessage(b[a].map(function(a){return a.message||\"\"})):void 0}}).filter(function(a){return void 0!==a}).join(\"\\n\\n\")},Aa.incompleteFallbackMessage=function(){\"use strict\";return axe._audit.data.incompleteFallbackMessage()};var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a},Ea=axe.constants.resultGroups;Aa.processAggregate=function(a,b){var c=axe.utils.aggregateResult(a);return c.timestamp=(new Date).toISOString(),c.url=window.location.href,Ea.forEach(function(a){b.resultTypes&&!b.resultTypes.includes(a)&&(c[a]||[]).forEach(function(a){Array.isArray(a.nodes)&&a.nodes.length>0&&(a.nodes=[a.nodes[0]])}),c[a]=(c[a]||[]).map(function(a){return a=Object.assign({},a),Array.isArray(a.nodes)&&a.nodes.length>0&&(a.nodes=a.nodes.map(function(a){return\"object\"===za(a.node)&&(a.html=a.node.source,b.elementRef&&!a.node.fromFrame&&(a.element=a.node.element),(!1!==b.selectors||a.node.fromFrame)&&(a.target=a.node.selector),b.xpath&&(a.xpath=a.node.xpath)),delete a.result,delete a.node,D(a,b),a})),Ea.forEach(function(b){return delete a[b]}),delete a.pageLevel,delete a.result,a})}),c},axe.addReporter(\"na\",function(a,b,c){\"use strict\";\"function\"==typeof b&&(c=b,b={});var d=Aa.processAggregate(a,b);c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})}),axe.addReporter(\"no-passes\",function(a,b,c){\"use strict\";\"function\"==typeof b&&(c=b,b={}),b.resultTypes=[\"violations\"];var d=Aa.processAggregate(a,b);c({violations:d.violations,timestamp:d.timestamp,url:d.url})}),axe.addReporter(\"raw\",function(a,b,c){\"use strict\";\"function\"==typeof b&&(c=b,b={}),c(a)}),axe.addReporter(\"v1\",function(a,b,c){\"use strict\";\"function\"==typeof b&&(c=b,b={});var d=Aa.processAggregate(a,b);d.violations.forEach(function(a){return a.nodes.forEach(function(a){a.failureSummary=Aa.failureSummary(a)})}),c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})}),axe.addReporter(\"v2\",function(a,b,c){\"use strict\";\"function\"==typeof b&&(c=b,b={});var d=Aa.processAggregate(a,b);c({violations:d.violations,passes:d.passes,incomplete:d.incomplete,inapplicable:d.inapplicable,timestamp:d.timestamp,url:d.url})},!0),axe.utils.aggregate=function(a,b,c){b=b.slice(),c&&b.push(c);var d=b.map(function(b){return a.indexOf(b)}).sort();return a[d.pop()]};var Fa=axe.constants,Ga=Fa.CANTTELL_PRIO,Ha=Fa.FAIL_PRIO,Ia=[];Ia[axe.constants.PASS_PRIO]=!0,Ia[axe.constants.CANTTELL_PRIO]=null,Ia[axe.constants.FAIL_PRIO]=!1;var Ja=[\"any\",\"all\",\"none\"];axe.utils.aggregateChecks=function(a){var b=Object.assign({},a);E(b,function(a,b){var c=Ia.indexOf(a.result);a.priority=-1!==c?c:axe.constants.CANTTELL_PRIO,\"none\"===b&&(a.priority=4-a.priority)});var c={all:b.all.reduce(function(a,b){return Math.max(a,b.priority)},0),none:b.none.reduce(function(a,b){return Math.max(a,b.priority)},0),any:b.any.reduce(function(a,b){return Math.min(a,b.priority)},4)%4};b.priority=Math.max(c.all,c.none,c.any);var d=[];return Ja.forEach(function(a){b[a]=b[a].filter(function(d){return d.priority===b.priority&&d.priority===c[a]}),b[a].forEach(function(a){return d.push(a.impact)})}),[Ga,Ha].includes(b.priority)?b.impact=axe.utils.aggregate(axe.constants.impact,d):b.impact=null,E(b,function(a){delete a.result,delete a.priority}),b.result=axe.constants.results[b.priority],delete b.priority,b},function(){axe.utils.aggregateNodeResults=function(a){var b={};if((a=a.map(function(a){if(a.any&&a.all&&a.none)return axe.utils.aggregateChecks(a);if(Array.isArray(a.node))return axe.utils.finalizeRuleResult(a);throw new TypeError(\"Invalid Result type\")}))&&a.length){var c=a.map(function(a){return a.result});b.result=axe.utils.aggregate(axe.constants.results,c,b.result)}else b.result=\"inapplicable\";axe.constants.resultGroups.forEach(function(a){return b[a]=[]}),a.forEach(function(a){var c=axe.constants.resultGroupMap[a.result];b[c].push(a)});var d=axe.constants.FAIL_GROUP;if(0===b[d].length&&(d=axe.constants.CANTTELL_GROUP),b[d].length>0){var e=b[d].map(function(a){return a.impact});b.impact=axe.utils.aggregate(axe.constants.impact,e)||null}else b.impact=null;return b}}(),axe.utils.aggregateResult=function(a){var b={};return axe.constants.resultGroups.forEach(function(a){return b[a]=[]}),a.forEach(function(a){a.error?F(b,a,axe.constants.CANTTELL_GROUP):a.result===axe.constants.NA?F(b,a,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(c){Array.isArray(a[c])&&a[c].length>0&&F(b,a,c)})}),b},axe.utils.areStylesSet=G,axe.utils.checkHelper=function(a,b,c,d){\"use strict\";return{isAsync:!1,async:function(){return this.isAsync=!0,function(b){b instanceof Error==!1?(a.result=b,c(a)):d(b)}},data:function(b){a.data=b},relatedNodes:function(c){c=c instanceof Node?[c]:axe.utils.toArray(c),a.relatedNodes=c.map(function(a){return new axe.utils.DqElement(a,b)})}}};var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};axe.utils.clone=function(a){\"use strict\";var b,c,d=a;if(null!==a&&\"object\"===(void 0===a?\"undefined\":za(a)))if(Array.isArray(a))for(d=[],b=0,c=a.length;b<c;b++)d[b]=axe.utils.clone(a[b]);else{d={};for(b in a)d[b]=axe.utils.clone(a[b])}return d},axe.utils.sendCommandToFrame=function(a,b,c,d){\"use strict\";var e=a.contentWindow;if(!e)return axe.log(\"Frame does not have a content window\",a),void c(null);var f=setTimeout(function(){f=setTimeout(function(){var e=H(\"No response from frame\",a);b.debug?d(e):(axe.log(e),c(null))},0)},500);axe.utils.respondable(e,\"axe.ping\",null,void 0,function(){clearTimeout(f);var g=b.options&&b.options.frameWaitTime||6e4;f=setTimeout(function(){d(H(\"Axe in frame timed out\",a))},g),axe.utils.respondable(e,\"axe.start\",b,void 0,function(a){clearTimeout(f),a instanceof Error==!1?c(a):d(a)})})},axe.utils.collectResultsFromFrames=I,axe.utils.contains=function(a,b){\"use strict\";function c(a,b){return a.shadowId===b.shadowId||!!a.children.find(function(a){return c(a,b)})}return a.shadowId||b.shadowId?c(a,b):\"function\"==typeof a.actualNode.contains?a.actualNode.contains(b.actualNode):!!(16&a.actualNode.compareDocumentPosition(b.actualNode))},function(axe){/*!\n  * The copyright below covers the code within this function block only\n  *\n  * Copyright (c) 2013 Dulin Marat\n  * \n  * Permission is hereby granted, free of charge, to any person obtaining a copy\n  * of this software and associated documentation files (the \"Software\"), to deal\n  * in the Software without restriction, including without limitation the rights\n  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  * copies of the Software, and to permit persons to whom the Software is\n  * furnished to do so, subject to the following conditions:\n  * \n  * The above copyright notice and this permission notice shall be included in\n  * all copies or substantial portions of the Software.\n  * \n  * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  * THE SOFTWARE.\n  */\nfunction a(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function b(a){return a>=\"a\"&&a<=\"z\"||a>=\"A\"&&a<=\"Z\"||\"-\"===a||\"_\"===a}function c(a){return a>=\"a\"&&a<=\"z\"||a>=\"A\"&&a<=\"Z\"||a>=\"0\"&&a<=\"9\"||\"-\"===a||\"_\"===a}function d(a){return a>=\"a\"&&a<=\"f\"||a>=\"A\"&&a<=\"F\"||a>=\"0\"&&a<=\"9\"}function e(a,e,g,j,k,l){var m,n,o,p,q;return p=a.length,m=null,o=function(b,c){var f,g,h;for(h=\"\",e++,m=a.charAt(e);e<p;){if(m===b)return e++,h;if(\"\\\\\"===m)if(e++,(m=a.charAt(e))===b)h+=b;else if(f=c[m])h+=f;else{if(d(m)){for(g=m,e++,m=a.charAt(e);d(m);)g+=m,e++,m=a.charAt(e);\" \"===m&&(e++,m=a.charAt(e)),h+=String.fromCharCode(parseInt(g,16));continue}h+=m}else h+=m;e++,m=a.charAt(e)}return h},n=function(){var b=\"\";for(m=a.charAt(e);e<p;){if(c(m))b+=m;else{if(\"\\\\\"!==m)return b;if(++e>=p)throw Error(\"Expected symbol but end of file reached.\");if(m=a.charAt(e),f[m])b+=m;else{if(d(m)){var g=m;for(e++,m=a.charAt(e);d(m);)g+=m,e++,m=a.charAt(e);\" \"===m&&(e++,m=a.charAt(e)),b+=String.fromCharCode(parseInt(g,16));continue}b+=m}}e++,m=a.charAt(e)}return b},q=function(){m=a.charAt(e);for(var b=!1;\" \"===m||\"\\t\"===m||\"\\n\"===m||\"\\r\"===m||\"\\f\"===m;)b=!0,e++,m=a.charAt(e);return b},this.parse=function(){var b=this.parseSelector();if(e<p)throw Error('Rule expected but \"'+a.charAt(e)+'\" found.');return b},this.parseSelector=function(){var b,c=b=this.parseSingleSelector();for(m=a.charAt(e);\",\"===m;){if(e++,q(),\"selectors\"!==b.type&&(b={type:\"selectors\",selectors:[c]}),!(c=this.parseSingleSelector()))throw Error('Rule expected after \",\".');b.selectors.push(c)}return b},this.parseSingleSelector=function(){q();var b={type:\"ruleSet\"},c=this.parseRule();if(!c)return null;for(var d=b;c&&(c.type=\"rule\",d.rule=c,d=c,q(),m=a.charAt(e),!(e>=p||\",\"===m||\")\"===m));)if(k[m]){var f=m;if(e++,q(),!(c=this.parseRule()))throw Error('Rule expected after \"'+f+'\".');c.nestingOperator=f}else(c=this.parseRule())&&(c.nestingOperator=null);return b},this.parseRule=function(){for(var c=null;e<p;)if(\"*\"===(m=a.charAt(e)))e++,(c=c||{}).tagName=\"*\";else if(b(m)||\"\\\\\"===m)(c=c||{}).tagName=n();else if(\".\"===m)e++,c=c||{},(c.classNames=c.classNames||[]).push(n());else if(\"#\"===m)e++,(c=c||{}).id=n();else if(\"[\"===m){e++,q();var d={name:n()};if(q(),\"]\"===m)e++;else{var f=\"\";if(j[m]&&(f=m,e++,m=a.charAt(e)),e>=p)throw Error('Expected \"=\" but end of file reached.');if(\"=\"!==m)throw Error('Expected \"=\" but \"'+m+'\" found.');d.operator=f+\"=\",e++,q();var k=\"\";if(d.valueType=\"string\",'\"'===m)k=o('\"',i);else if(\"'\"===m)k=o(\"'\",h);else if(l&&\"$\"===m)e++,k=n(),d.valueType=\"substitute\";else{for(;e<p&&\"]\"!==m;)k+=m,e++,m=a.charAt(e);k=k.trim()}if(q(),e>=p)throw Error('Expected \"]\" but end of file reached.');if(\"]\"!==m)throw Error('Expected \"]\" but \"'+m+'\" found.');e++,d.value=k}c=c||{},(c.attrs=c.attrs||[]).push(d)}else{if(\":\"!==m)break;e++;var r=n(),s={name:r};if(\"(\"===m){e++;var t=\"\";if(q(),\"selector\"===g[r])s.valueType=\"selector\",t=this.parseSelector();else{if(s.valueType=g[r]||\"string\",'\"'===m)t=o('\"',i);else if(\"'\"===m)t=o(\"'\",h);else if(l&&\"$\"===m)e++,t=n(),s.valueType=\"substitute\";else{for(;e<p&&\")\"!==m;)t+=m,e++,m=a.charAt(e);t=t.trim()}q()}if(e>=p)throw Error('Expected \")\" but end of file reached.');if(\")\"!==m)throw Error('Expected \")\" but \"'+m+'\" found.');e++,s.value=t}c=c||{},(c.pseudos=c.pseudos||[]).push(s)}return c},this}a.prototype.registerSelectorPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.pseudos[a]=\"selector\";return this},a.prototype.unregisterSelectorPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.pseudos[a];return this},a.prototype.registerNumericPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.pseudos[a]=\"numeric\";return this},a.prototype.unregisterNumericPseudos=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.pseudos[a];return this},a.prototype.registerNestingOperators=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.ruleNestingOperators[a]=!0;return this},a.prototype.unregisterNestingOperators=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.ruleNestingOperators[a];return this},a.prototype.registerAttrEqualityMods=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],this.attrEqualityMods[a]=!0;return this},a.prototype.unregisterAttrEqualityMods=function(a){for(var b=0,c=arguments.length;b<c;b++)a=arguments[b],delete this.attrEqualityMods[a];return this},a.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},a.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var f={\"!\":!0,'\"':!0,\"#\":!0,$:!0,\"%\":!0,\"&\":!0,\"'\":!0,\"(\":!0,\")\":!0,\"*\":!0,\"+\":!0,\",\":!0,\".\":!0,\"/\":!0,\";\":!0,\"<\":!0,\"=\":!0,\">\":!0,\"?\":!0,\"@\":!0,\"[\":!0,\"\\\\\":!0,\"]\":!0,\"^\":!0,\"`\":!0,\"{\":!0,\"|\":!0,\"}\":!0,\"~\":!0},g={\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\f\":\"\\\\f\",\"\\v\":\"\\\\v\"},h={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",\"'\":\"'\"},i={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",'\"':'\"'};a.prototype.parse=function(a){return new e(a,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},a.prototype.escapeIdentifier=function(a){for(var b=\"\",c=0,d=a.length;c<d;){var e=a.charAt(c);if(f[e])b+=\"\\\\\"+e;else if(\"_\"===e||\"-\"===e||e>=\"A\"&&e<=\"Z\"||e>=\"a\"&&e<=\"z\"||0!==c&&e>=\"0\"&&e<=\"9\")b+=e;else{var g=e.charCodeAt(0);if(55296==(63488&g)){var h=a.charCodeAt(c++);if(55296!=(64512&g)||56320!=(64512&h))throw Error(\"UCS-2(decode): illegal sequence\");g=((1023&g)<<10)+(1023&h)+65536}b+=\"\\\\\"+g.toString(16)+\" \"}c++}return b},a.prototype.escapeStr=function(a){for(var b,c,d=\"\",e=0,f=a.length;e<f;)b=a.charAt(e),'\"'===b?b='\\\\\"':\"\\\\\"===b?b=\"\\\\\\\\\":(c=g[b])&&(b=c),d+=b,e++;return'\"'+d+'\"'},a.prototype.render=function(a){return this._renderEntity(a).trim()},a.prototype._renderEntity=function(a){var b,c,d;switch(d=\"\",a.type){case\"ruleSet\":for(b=a.rule,c=[];b;)b.nestingOperator&&c.push(b.nestingOperator),c.push(this._renderEntity(b)),b=b.rule;d=c.join(\" \");break;case\"selectors\":d=a.selectors.map(this._renderEntity,this).join(\", \");break;case\"rule\":a.tagName&&(d=\"*\"===a.tagName?\"*\":this.escapeIdentifier(a.tagName)),a.id&&(d+=\"#\"+this.escapeIdentifier(a.id)),a.classNames&&(d+=a.classNames.map(function(a){return\".\"+this.escapeIdentifier(a)},this).join(\"\")),a.attrs&&(d+=a.attrs.map(function(a){return a.operator?\"substitute\"===a.valueType?\"[\"+this.escapeIdentifier(a.name)+a.operator+\"$\"+a.value+\"]\":\"[\"+this.escapeIdentifier(a.name)+a.operator+this.escapeStr(a.value)+\"]\":\"[\"+this.escapeIdentifier(a.name)+\"]\"},this).join(\"\")),a.pseudos&&(d+=a.pseudos.map(function(a){return a.valueType?\"selector\"===a.valueType?\":\"+this.escapeIdentifier(a.name)+\"(\"+this._renderEntity(a.value)+\")\":\"substitute\"===a.valueType?\":\"+this.escapeIdentifier(a.name)+\"($\"+a.value+\")\":\"numeric\"===a.valueType?\":\"+this.escapeIdentifier(a.name)+\"(\"+a.value+\")\":\":\"+this.escapeIdentifier(a.name)+\"(\"+this.escapeIdentifier(a.value)+\")\":\":\"+this.escapeIdentifier(a.name)},this).join(\"\"));break;default:throw Error('Unknown entity type: \"'+a.type(NaN))}return d};var j=new a;j.registerNestingOperators(\">\"),axe.utils.cssParser=j}(axe),L.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){\"use strict\";return{selector:this.selector,source:this.source,xpath:this.xpath}}},L.fromFrame=function(a,b,c){return a.selector.unshift(c.selector),a.xpath.unshift(c.xpath),new axe.utils.DqElement(c.element,b,a)},axe.utils.DqElement=L,axe.utils.matchesSelector=function(){\"use strict\";function a(a){var b,c,d=a.Element.prototype,e=[\"matches\",\"matchesSelector\",\"mozMatchesSelector\",\"webkitMatchesSelector\",\"msMatchesSelector\"],f=e.length;for(b=0;b<f;b++)if(c=e[b],d[c])return c}var b;return function(c,d){return b&&c[b]||(b=a(c.ownerDocument.defaultView)),c[b](d)}}(),axe.utils.escapeSelector=function(a){\"use strict\";for(var b,c=String(a),d=c.length,e=-1,f=\"\",g=c.charCodeAt(0);++e<d;){if(0==(b=c.charCodeAt(e)))throw new Error(\"INVALID_CHARACTER_ERR\");b>=1&&b<=31||b>=127&&b<=159||0==e&&b>=48&&b<=57||1==e&&b>=48&&b<=57&&45==g?f+=\"\\\\\"+b.toString(16)+\" \":f+=(1!=e||45!=b||45!=g)&&(b>=128||45==b||95==b||b>=48&&b<=57||b>=65&&b<=90||b>=97&&b<=122)?c.charAt(e):\"\\\\\"+c.charAt(e)}return f},axe.utils.extendMetaData=function(a,b){Object.assign(a,b),Object.keys(b).filter(function(a){return\"function\"==typeof b[a]}).forEach(function(c){a[c]=null;try{a[c]=b[c](a)}catch(a){}})},axe.utils.finalizeRuleResult=function(a){return Object.assign(a,axe.utils.aggregateNodeResults(a.nodes)),delete a.nodes,a};var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};axe.utils.findBy=function(a,b,c){if(Array.isArray(a))return a.find(function(a){return\"object\"===(void 0===a?\"undefined\":za(a))&&a[b]===c})};var axe=axe||{utils:{}};axe.utils.getFlattenedTree=function(a,b){function c(a,c){var d=axe.utils.getFlattenedTree(c,b);return d&&(a=a.concat(d)),a}var d,e,f;if(a.documentElement&&(a=a.documentElement),f=a.nodeName.toLowerCase(),axe.utils.isShadowRoot(a))return d=M(a,b),b=\"a\"+Math.random().toString().substring(2),e=Array.from(a.shadowRoot.childNodes),d.children=e.reduce(c,[]),[d];if(\"content\"===f)return e=Array.from(a.getDistributedNodes()),e.reduce(c,[]);if(\"slot\"===f){e=Array.from(a.assignedNodes()),e.length||(e=N(a));window.getComputedStyle(a);return e.reduce(c,[])}return 1===a.nodeType?(d=M(a,b),e=Array.from(a.childNodes),d.children=e.reduce(c,[]),[d]):3===a.nodeType?[M(a)]:void 0},axe.utils.getNodeFromTree=function(a,b){var c;return a.actualNode===b?a:(a.children.forEach(function(a){var d;a.actualNode===b?c=a:(d=axe.utils.getNodeFromTree(a,b))&&(c=d)}),c)},axe.utils.getAllChecks=function(a){\"use strict\";return[].concat(a.any||[]).concat(a.all||[]).concat(a.none||[])},axe.utils.getCheckOption=function(a,b,c){var d=((c.rules&&c.rules[b]||{}).checks||{})[a.id],e=(c.checks||{})[a.id],f=a.enabled,g=a.options;return e&&(e.hasOwnProperty(\"enabled\")&&(f=e.enabled),e.hasOwnProperty(\"options\")&&(g=e.options)),d&&(d.hasOwnProperty(\"enabled\")&&(f=d.enabled),d.hasOwnProperty(\"options\")&&(g=d.options)),{enabled:f,options:g,absolutePaths:c.absolutePaths}};var Ka=function(){function a(a,b){var c=[],d=!0,e=!1,f=void 0;try{for(var g,h=a[Symbol.iterator]();!(d=(g=h.next()).done)&&(c.push(g.value),!b||c.length!==b);d=!0);}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}return c}return function(b,c){if(Array.isArray(b))return b;if(Symbol.iterator in Object(b))return a(b,c);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}();axe.utils.getFriendlyUriEnd=function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(a.length<=1||\"data:\"===a.substr(0,5)||\"javascript:\"===a.substr(0,11)||a.includes(\"?\"))){var c=b.currentDomain,d=b.maxLength,e=void 0===d?25:d,f=Q(a),g=f.path,h=f.domain,i=f.hash,j=g.substr(g.substr(0,g.length-2).lastIndexOf(\"/\")+1);if(i)return j&&(j+i).length<=e?j+i:j.length<2&&i.length>2&&i.length<=e?i:void 0;if(h&&h.length<e&&g.length<=1)return h+g;if(g===\"/\"+j&&h&&c&&h!==c&&(h+g).length<=e)return h+g;var k=j.lastIndexOf(\".\");return(-1===k||k>1)&&(-1!==k||j.length>2)&&j.length<=e&&!j.match(/index(\\.[a-zA-Z]{2-4})?/)&&!O(j)?j:void 0}};var La=axe.utils.escapeSelector,Ma=void 0,Na=[\"class\",\"style\",\"id\",\"selected\",\"checked\",\"disabled\",\"tabindex\",\"aria-checked\",\"aria-selected\",\"aria-invalid\",\"aria-activedescendant\",\"aria-busy\",\"aria-disabled\",\"aria-expanded\",\"aria-grabbed\",\"aria-pressed\",\"aria-valuenow\"],Oa=31;axe.utils.getSelectorData=function(a){var b={classes:{},tags:{},attributes:{}};a=Array.isArray(a)?a:[a];for(var c=a.slice(),d=[];c.length;)!function(){var a=c.pop(),e=a.actualNode;if(e.querySelectorAll){var f=e.nodeName;b.tags[f]?b.tags[f]++:b.tags[f]=1,e.classList&&Array.from(e.classList).forEach(function(a){var c=La(a);b.classes[c]?b.classes[c]++:b.classes[c]=1}),e.attributes&&Array.from(e.attributes).filter(T).forEach(function(a){var c=R(e,a);c&&(b.attributes[c]?b.attributes[c]++:b.attributes[c]=1)})}for(a.children.length&&(d.push(c),c=a.children.slice());!c.length&&d.length;)c=d.pop()}();return b},axe.utils.getSelector=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!a)return\"\";var c=a.getRootNode&&a.getRootNode()||document;if(11===c.nodeType){for(var d=[];11===c.nodeType;)d.push({elm:a,doc:c}),a=c.host,c=a.getRootNode();return d.push({elm:a,doc:c}),d.reverse().map(function(a){return $(a.elm,b,a.doc)})}return $(a,b,c)},axe.utils.getXpath=function(a){return aa(_(a))};var Pa;axe.utils.injectStyle=ba,axe.utils.isHidden=function(a,b){\"use strict\";var c;if(9===a.nodeType)return!1;11===a.nodeType&&(a=a.host);var d=window.getComputedStyle(a,null);return!d||!a.parentNode||\"none\"===d.getPropertyValue(\"display\")||!b&&\"hidden\"===d.getPropertyValue(\"visibility\")||\"true\"===a.getAttribute(\"aria-hidden\")||(c=a.assignedSlot?a.assignedSlot:a.parentNode,axe.utils.isHidden(c,!0))};var Qa=[\"article\",\"aside\",\"blockquote\",\"body\",\"div\",\"footer\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"main\",\"nav\",\"p\",\"section\",\"span\"];axe.utils.isShadowRoot=function(a){var b=a.nodeName.toLowerCase();return!(!a.shadowRoot||!/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(b)&&!Qa.includes(b))},axe.utils.isXHTML=function(a){\"use strict\";return!!a.createElement&&\"A\"===a.createElement(\"A\").localName},axe.utils.mergeResults=function(a,b){\"use strict\";var c=[];return a.forEach(function(a){var d=ea(a);d&&d.length&&d.forEach(function(d){d.nodes&&a.frame&&ca(d.nodes,b,a.frameElement,a.frame);var e=axe.utils.findBy(c,\"id\",d.id);e?d.nodes.length&&da(e.nodes,d.nodes):c.push(d)})}),c},axe.utils.nodeSorter=function(a,b){\"use strict\";return a.actualNode===b.actualNode?0:4&a.actualNode.compareDocumentPosition(b.actualNode)?-1:1},utils.performanceTimer=function(){\"use strict\";function a(){if(window.performance&&window.performance)return window.performance.now()}var b=null,c=a();return{start:function(){this.mark(\"mark_axe_start\")},end:function(){this.mark(\"mark_axe_end\"),this.measure(\"axe\",\"mark_axe_start\",\"mark_axe_end\"),this.logMeasures(\"axe\")},auditStart:function(){this.mark(\"mark_audit_start\")},auditEnd:function(){this.mark(\"mark_audit_end\"),this.measure(\"audit_start_to_end\",\"mark_audit_start\",\"mark_audit_end\"),this.logMeasures()},mark:function(a){window.performance&&void 0!==window.performance.mark&&window.performance.mark(a)},measure:function(a,b,c){window.performance&&void 0!==window.performance.measure&&window.performance.measure(a,b,c)},logMeasures:function(a){function b(a){axe.log(\"Measure \"+a.name+\" took \"+a.duration+\"ms\")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var c=window.performance.getEntriesByType(\"measure\"),d=0;d<c.length;++d){var e=c[d];if(e.name===a)return void b(e);b(e)}},timeElapsed:function(){return a()-c},reset:function(){b||(b=a()),c=a()}}}(),\"function\"!=typeof Object.assign&&function(){Object.assign=function(a){\"use strict\";if(void 0===a||null===a)throw new TypeError(\"Cannot convert undefined or null to object\");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)d.hasOwnProperty(e)&&(b[e]=d[e])}return b}}(),Array.prototype.find||Object.defineProperty(Array.prototype,\"find\",{value:function(a){if(null===this)throw new TypeError(\"Array.prototype.find called on null or undefined\");if(\"function\"!=typeof a)throw new TypeError(\"predicate must be a function\");for(var b,c=Object(this),d=c.length>>>0,e=arguments[1],f=0;f<d;f++)if(b=c[f],a.call(e,b,f,c))return b}}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var a=function(){var a=document.createElement(\"x\");return a.style.cssText=\"pointer-events:auto\",\"auto\"===a.style.pointerEvents}(),b=a?\"pointer-events\":\"visibility\",c=a?\"none\":\"hidden\",d=document.createElement(\"style\");return d.innerHTML=a?\"* { pointer-events: all }\":\"* { visibility: visible }\",function(a,e){var f,g,h,i=[],j=[];for(document.head.appendChild(d);(f=document.elementFromPoint(a,e))&&-1===i.indexOf(f);)i.push(f),j.push({value:f.style.getPropertyValue(b),priority:f.style.getPropertyPriority(b)}),f.style.setProperty(b,c,\"important\");for(i.indexOf(document.documentElement)<i.length-1&&(i.splice(i.indexOf(document.documentElement),1),i.push(document.documentElement)),g=j.length;h=j[--g];)i[g].style.setProperty(b,h.value?h.value:\"\",h.priority);return document.head.removeChild(d),i}},\"function\"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||Object.defineProperty(Array.prototype,\"includes\",{value:function(a){\"use strict\";var b=Object(this),c=parseInt(b.length,10)||0;if(0===c)return!1;var d,e=parseInt(arguments[1],10)||0;e>=0?d=e:(d=c+e)<0&&(d=0);for(var f;d<c;){if(f=b[d],a===f||a!==a&&f!==f)return!0;d++}return!1}}),Array.prototype.some||Object.defineProperty(Array.prototype,\"some\",{value:function(a){\"use strict\";if(null==this)throw new TypeError(\"Array.prototype.some called on null or undefined\");if(\"function\"!=typeof a)throw new TypeError;for(var b=Object(this),c=b.length>>>0,d=arguments.length>=2?arguments[1]:void 0,e=0;e<c;e++)if(e in b&&a.call(d,b[e],e,b))return!0;return!1}}),Array.from||Object.defineProperty(Array,\"from\",{value:function(){var a=Object.prototype.toString,b=function(b){return\"function\"==typeof b||\"[object Function]\"===a.call(b)},c=function(a){var b=Number(a);return isNaN(b)?0:0!==b&&isFinite(b)?(b>0?1:-1)*Math.floor(Math.abs(b)):b},d=Math.pow(2,53)-1,e=function(a){var b=c(a);return Math.min(Math.max(b,0),d)};return function(a){var c=this,d=Object(a);if(null==a)throw new TypeError(\"Array.from requires an array-like object - not null or undefined\");var f,g=arguments.length>1?arguments[1]:void 0;if(void 0!==g){if(!b(g))throw new TypeError(\"Array.from: when provided, the second argument must be a function\");arguments.length>2&&(f=arguments[2])}for(var h,i=e(d.length),j=b(c)?Object(new c(i)):new Array(i),k=0;k<i;)h=d[k],j[k]=g?void 0===f?g(h,k):g.call(f,h,k):h,k+=1;return j.length=i,j}}()}),String.prototype.includes||(String.prototype.includes=function(a,b){return\"number\"!=typeof b&&(b=0),!(b+a.length>this.length)&&-1!==this.indexOf(a,b)});var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};axe.utils.publishMetaData=function(a){\"use strict\";var b=axe._audit.data.checks||{},c=axe._audit.data.rules||{},d=axe.utils.findBy(axe._audit.rules,\"id\",a.id)||{};a.tags=axe.utils.clone(d.tags||[]);var e=ga(b,!0),f=ga(b,!1);a.nodes.forEach(function(a){a.any.forEach(e),a.all.forEach(e),a.none.forEach(f)}),axe.utils.extendMetaData(a,axe.utils.clone(c[a.id]||{}))};var Ra=function(){},Sa=function(){},Ta=function(){/*! Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License */\nvar a=/(?=[\\-\\[\\]{}()*+?.\\\\\\^$|,#\\s])/g;return function(b){return b.replace(a,\"\\\\\")}}(),Ua=/\\\\/g;Ra=function(a){return a.map(function(a){for(var b=[],c=a.rule;c;)b.push({tag:c.tagName?c.tagName.toLowerCase():\"*\",combinator:c.nestingOperator?c.nestingOperator:\" \",id:c.id,attributes:ma(c.attrs),classes:na(c.classNames),pseudos:oa(c.pseudos)}),c=c.rule;return b})},Sa=function(a,b,c,d){for(var e=[],f=Array.isArray(a)?a:[a],g=pa(f,b,[],a[0].shadowId),h=[];g.nodes.length;){for(var i=g.nodes.pop(),j=[],k=[],l=g.anyLevel.slice().concat(g.thisLevel),m=!1,n=0;n<l.length;n++){var o=l[n];if(qa(i,o)&&(!o[0].id||i.shadowId===g.parentShadowId))if(1===o.length)m||d&&!d(i)||(h.push(i),m=!0);else{var p=o.slice(1);if(!1===[\" \",\">\"].includes(p[0].combinator))throw new Error(\"axe.utils.querySelectorAll does not support the combinator: \"+o[1].combinator);\">\"===p[0].combinator?j.push(p):k.push(p)}!g.anyLevel.includes(o)||o[0].id&&i.shadowId!==g.parentShadowId||k.push(o)}for(i.children&&i.children.length&&c&&(e.push(g),g=pa(i.children,k,j,i.shadowId));!g.nodes.length&&e.length;)g=e.pop()}return h},axe.utils.querySelectorAll=function(a,b){return axe.utils.querySelectorAllFilter(a,b)},axe.utils.querySelectorAllFilter=function(a,b,c){a=Array.isArray(a)?a:[a];var d=axe.utils.cssParser.parse(b);return d=d.selectors?d.selectors:[d],d=Ra(d),Sa(a,d,!0,c)};var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};!function(){\"use strict\";function a(){}function b(a){if(\"function\"!=typeof a)throw new TypeError(\"Queue methods require functions as arguments\")}function c(){function c(b){return function(c){g[b]=c,(i-=1)||j===a||(k=!0,j(g))}}function d(b){return j=a,m(b),g}function e(){for(var a=g.length;h<a;h++){var b=g[h];try{b.call(null,c(h),d)}catch(a){d(a)}}}var f,g=[],h=0,i=0,j=a,k=!1,l=function(a){f=a,setTimeout(function(){void 0!==f&&null!==f&&axe.log(\"Uncaught error (of queue)\",f)},1)},m=l,n={defer:function(a){if(\"object\"===(void 0===a?\"undefined\":za(a))&&a.then&&a.catch){var c=a;a=function(a,b){c.then(a).catch(b)}}if(b(a),void 0===f){if(k)throw new Error(\"Queue already completed\");return g.push(a),++i,e(),n}},then:function(c){if(b(c),j!==a)throw new Error(\"queue `then` already set\");return f||(j=c,i||(k=!0,j(g))),n},catch:function(a){if(b(a),m!==l)throw new Error(\"queue `catch` already set\");return f?(a(f),f=null):m=a,n},abort:d};return n}axe.utils.queue=c}();var za=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&\"function\"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?\"symbol\":typeof a};!function(a){\"use strict\";function b(){var a=\"axe\",b=\"\";return void 0!==axe&&axe._audit&&!axe._audit.application&&(a=axe._audit.application),void 0!==axe&&(b=axe.version),a+\".\"+b}function c(a){if(\"object\"===(void 0===a?\"undefined\":za(a))&&\"string\"==typeof a.uuid&&!0===a._respondable){var c=b();return a._source===c||\"axe.x.y.z\"===a._source||\"axe.x.y.z\"===c}return!1}function d(a,c,d,e,f,g){var h;d instanceof Error&&(h={name:d.name,message:d.message,stack:d.stack},d=void 0);var i={uuid:e,topic:c,message:d,error:h,_respondable:!0,_source:b(),_keepalive:f};\"function\"==typeof g&&(j[e]=g),a.postMessage(JSON.stringify(i),\"*\")}function e(a,b,c,e,f){d(a,b,c,Va.v1(),e,f)}function f(a,b,c){return function(e,f,g){d(a,b,e,c,f,g)}}function g(a,b,c){var d=b.topic,e=k[d];if(e){var g=f(a,null,b.uuid);e(b.message,c,g)}}function h(a){var b=a.message||\"Unknown error occurred\",c=l.includes(a.name)?a.name:\"Error\",d=window[c]||Error;return a.stack&&(b+=\"\\n\"+a.stack.replace(a.message,\"\")),new d(b)}function i(a){var b;if(\"string\"==typeof a){try{b=JSON.parse(a)}catch(a){}if(c(b))return\"object\"===za(b.error)?b.error=h(b.error):b.error=void 0,b}}var j={},k={},l=Object.freeze([\"EvalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);e.subscribe=function(a,b){k[a]=b},e.isInFrame=function(a){return a=a||window,!!a.frameElement},\"function\"==typeof window.addEventListener&&window.addEventListener(\"message\",function(a){var b=i(a.data);if(b){var c=b.uuid,e=b._keepalive,h=j[c];if(h){h(b.error||b.message,e,f(a.source,b.topic,c)),e||delete j[c]}if(!b.error)try{g(a.source,b,e)}catch(e){d(a.source,b.topic,e,c,!1)}}},!1),a.respondable=e}(utils),axe.utils.ruleShouldRun=function(a,b,c){\"use strict\";var d=c.runOnly||{},e=(c.rules||{})[a.id];return!(a.pageLevel&&!b.page)&&(\"rule\"===d.type?-1!==d.values.indexOf(a.id):e&&\"boolean\"==typeof e.enabled?e.enabled:\"tag\"===d.type&&d.values?ra(a,d.values):ra(a,[]))},axe.utils.getScrollState=function(){var a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window,b=a.document.documentElement;return[void 0!==a.pageXOffset?{elm:a,top:a.pageYOffset,left:a.pageXOffset}:{elm:b,top:b.scrollTop,left:b.scrollLeft}].concat(ua(document.body))},axe.utils.setScrollState=function(a){a.forEach(function(a){return ta(a.elm,a.top,a.left)})},axe.utils.select=function(a,b){\"use strict\";var c,d=[];if(axe._selectCache)for(var e=0,f=axe._selectCache.length;e<f;e++){var g=axe._selectCache[e];if(g.selector===a)return g.result}for(var h=function(a){return function(b){return wa(b,a)}}(b),i=ya(b.include),j=0;j<i.length;j++)c=i[j],c.actualNode.nodeType===c.actualNode.ELEMENT_NODE&&axe.utils.matchesSelector(c.actualNode,a)&&h(c)&&(d=xa(d,[c])),d=xa(d,axe.utils.querySelectorAllFilter(c,a,h));return axe._selectCache&&axe._selectCache.push({selector:a,result:d}),d},axe.utils.toArray=function(a){\"use strict\";return Array.prototype.slice.call(a)},axe.utils.uniqueArray=function(a,b){return a.concat(b).filter(function(a,b,c){return c.indexOf(a)===b})};var Va;!function(a){function b(a,b,c){var d=b&&c||0,e=0;for(b=b||[],a.toLowerCase().replace(/[0-9a-f]{2}/g,function(a){e<16&&(b[d+e++]=l[a])});e<16;)b[d+e++]=0;return b}function c(a,b){var c=b||0,d=k;return d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+\"-\"+d[a[c++]]+d[a[c++]]+\"-\"+d[a[c++]]+d[a[c++]]+\"-\"+d[a[c++]]+d[a[c++]]+\"-\"+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]+d[a[c++]]}function d(a,b,d){var e=b&&d||0,f=b||[];a=a||{};var g=null!=a.clockseq?a.clockseq:p,h=null!=a.msecs?a.msecs:(new Date).getTime(),i=null!=a.nsecs?a.nsecs:r+1,j=h-q+(i-r)/1e4;if(j<0&&null==a.clockseq&&(g=g+1&16383),(j<0||h>q)&&null==a.nsecs&&(i=0),i>=1e4)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");q=h,r=i,p=g,h+=122192928e5;var k=(1e4*(268435455&h)+i)%4294967296;f[e++]=k>>>24&255,f[e++]=k>>>16&255,f[e++]=k>>>8&255,f[e++]=255&k;var l=h/4294967296*1e4&268435455;f[e++]=l>>>8&255,f[e++]=255&l,f[e++]=l>>>24&15|16,f[e++]=l>>>16&255,f[e++]=g>>>8|128,f[e++]=255&g;for(var m=a.node||o,n=0;n<6;n++)f[e+n]=m[n];return b||c(f)}function e(a,b,d){var e=b&&d||0;\"string\"==typeof a&&(b=\"binary\"==a?new j(16):null,a=null),a=a||{};var g=a.random||(a.rng||f)();if(g[6]=15&g[6]|64,g[8]=63&g[8]|128,b)for(var h=0;h<16;h++)b[e+h]=g[h];return b||c(g)}var f,g=a.crypto||a.msCrypto;if(!f&&g&&g.getRandomValues){var h=new Uint8Array(16);f=function(){return g.getRandomValues(h),h}}if(!f){var i=new Array(16);f=function(){for(var a,b=0;b<16;b++)0==(3&b)&&(a=4294967296*Math.random()),i[b]=a>>>((3&b)<<3)&255;return i}}for(var j=\"function\"==typeof a.Buffer?a.Buffer:Array,k=[],l={},m=0;m<256;m++)k[m]=(m+256).toString(16).substr(1),l[k[m]]=m;var n=f(),o=[1|n[0],n[1],n[2],n[3],n[4],n[5]],p=16383&(n[6]<<8|n[7]),q=0,r=0;Va=e,Va.v1=d,Va.v4=e,Va.parse=b,Va.unparse=c,Va.BufferClass=j}(window),axe._load({data:{rules:{accesskeys:{description:\"Ensures every accesskey attribute value is unique\",help:\"accesskey attribute value must be unique\"},\"area-alt\":{description:\"Ensures <area> elements of image maps have alternate text\",help:\"Active <area> elements must have alternate text\"},\"aria-allowed-attr\":{description:\"Ensures ARIA attributes are allowed for an element's role\",help:\"Elements must only use allowed ARIA attributes\"},\"aria-hidden-body\":{description:\"Ensures aria-hidden='true' is not present on the document body.\",help:\"aria-hidden='true' must not be present on the document body\"},\"aria-required-attr\":{description:\"Ensures elements with ARIA roles have all required ARIA attributes\",help:\"Required ARIA attributes must be provided\"},\"aria-required-children\":{description:\"Ensures elements with an ARIA role that require child roles contain them\",help:\"Certain ARIA roles must contain particular children\"},\"aria-required-parent\":{description:\"Ensures elements with an ARIA role that require parent roles are contained by them\",help:\"Certain ARIA roles must be contained by particular parents\"},\"aria-roles\":{description:\"Ensures all elements with a role attribute use a valid value\",help:\"ARIA roles used must conform to valid values\"},\"aria-valid-attr-value\":{description:\"Ensures all ARIA attributes have valid values\",help:\"ARIA attributes must conform to valid values\"},\"aria-valid-attr\":{description:\"Ensures attributes that begin with aria- are valid ARIA attributes\",help:\"ARIA attributes must conform to valid names\"},\"audio-caption\":{description:\"Ensures <audio> elements have captions\",help:\"<audio> elements must have a captions track\"},blink:{description:\"Ensures <blink> elements are not used\",help:\"<blink> elements are deprecated and must not be used\"},\"button-name\":{description:\"Ensures buttons have discernible text\",help:\"Buttons must have discernible text\"},bypass:{description:\"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content\",help:\"Page must have means to bypass repeated blocks\"},checkboxgroup:{description:'Ensures related <input type=\"checkbox\"> elements have a group and that that group designation is consistent',help:\"Checkbox inputs with the same name attribute value must be part of a group\"},\"color-contrast\":{description:\"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds\",help:\"Elements must have sufficient color contrast\"},\"definition-list\":{description:\"Ensures <dl> elements are structured correctly\",help:\"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements\"},dlitem:{description:\"Ensures <dt> and <dd> elements are contained by a <dl>\",help:\"<dt> and <dd> elements must be contained by a <dl>\"},\"document-title\":{description:\"Ensures each HTML document contains a non-empty <title> element\",help:\"Documents must have <title> element to aid in navigation\"},\"duplicate-id\":{description:\"Ensures every id attribute value is unique\",help:\"id attribute value must be unique\"},\"empty-heading\":{description:\"Ensures headings have discernible text\",help:\"Headings must not be empty\"},\"focus-order-semantics\":{description:\"Ensures elements in the focus order have an appropriate role\",help:\"Elements in the focus order need a role appropriate for interactive content\"},\"frame-title-unique\":{description:\"Ensures <iframe> and <frame> elements contain a unique title attribute\",help:\"Frames must have a unique title attribute\"},\"frame-title\":{description:\"Ensures <iframe> and <frame> elements contain a non-empty title attribute\",help:\"Frames must have title attribute\"},\"heading-order\":{description:\"Ensures the order of headings is semantically correct\",help:\"Heading levels should only increase by one\"},\"hidden-content\":{description:\"Informs users about hidden content.\",help:\"Hidden content on the page cannot be analyzed\"},\"html-has-lang\":{description:\"Ensures every HTML document has a lang attribute\",help:\"<html> element must have a lang attribute\"},\"html-lang-valid\":{description:\"Ensures the lang attribute of the <html> element has a valid value\",help:\"<html> element must have a valid value for the lang attribute\"},\"image-alt\":{description:\"Ensures <img> elements have alternate text or a role of none or presentation\",help:\"Images must have alternate text\"},\"image-redundant-alt\":{description:\"Ensure button and link text is not repeated as image alternative\",help:\"Text of buttons and links should not be repeated in the image alternative\"},\"input-image-alt\":{description:'Ensures <input type=\"image\"> elements have alternate text',help:\"Image buttons must have alternate text\"},\"label-title-only\":{description:\"Ensures that every form element is not solely labeled using the title or aria-describedby attributes\",help:\"Form elements should have a visible label\"},label:{description:\"Ensures every form element has a label\",help:\"Form elements must have labels\"},\"landmark-main-is-top-level\":{description:\"The main landmark should not be contained in another landmark\",help:\"Main landmark is not at top level\"},\"landmark-one-main\":{description:\"Ensures a navigation point to the primary content of the page. If the page contains iframes, each iframe should contain either no main landmarks or just one.\",help:\"Page must contain one main landmark.\"},\"layout-table\":{description:\"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute\",help:\"Layout tables must not use data table elements\"},\"link-in-text-block\":{description:\"Links can be distinguished without relying on color\",help:\"Links must be distinguished from surrounding text in a way that does not rely on color\"},\"link-name\":{description:\"Ensures links have discernible text\",help:\"Links must have discernible text\"},list:{description:\"Ensures that lists are structured correctly\",help:\"<ul> and <ol> must only directly contain <li>, <script> or <template> elements\"},listitem:{description:\"Ensures <li> elements are used semantically\",help:\"<li> elements must be contained in a <ul> or <ol>\"},marquee:{description:\"Ensures <marquee> elements are not used\",help:\"<marquee> elements are deprecated and must not be used\"},\"meta-refresh\":{description:'Ensures <meta http-equiv=\"refresh\"> is not used',help:\"Timed refresh must not exist\"},\"meta-viewport-large\":{description:'Ensures <meta name=\"viewport\"> can scale a significant amount',help:\"Users should be able to zoom and scale the text up to 500%\"},\"meta-viewport\":{description:'Ensures <meta name=\"viewport\"> does not disable text scaling and zooming',help:\"Zooming and scaling must not be disabled\"},\"object-alt\":{description:\"Ensures <object> elements have alternate text\",help:\"<object> elements must have alternate text\"},\"p-as-heading\":{description:\"Ensure p elements are not used to style headings\",help:\"Bold, italic text and font-size are not used to style p elements as a heading\"},radiogroup:{description:'Ensures related <input type=\"radio\"> elements have a group and that the group designation is consistent',help:\"Radio inputs with the same name attribute value must be part of a group\"},region:{description:\"Ensures all content is contained within a landmark region\",help:\"Content should be contained in a landmark region\"},\"scope-attr-valid\":{description:\"Ensures the scope attribute is used correctly on tables\",help:\"scope attribute should be used correctly\"},\"server-side-image-map\":{description:\"Ensures that server-side image maps are not used\",help:\"Server-side image maps must not be used\"},\"skip-link\":{description:\"Ensure all skip links have a focusable target\",help:\"The skip-link target should exist and be focusable\"},tabindex:{description:\"Ensures tabindex attribute values are not greater than 0\",help:\"Elements should not have tabindex greater than zero\"},\"table-duplicate-name\":{description:\"Ensure that tables do not have the same summary and caption\",help:\"The <caption> element should not contain the same text as the summary attribute\"},\"table-fake-caption\":{description:\"Ensure that tables with a caption use the <caption> element.\",help:\"Data or header cells should not be used to give caption to a data table.\"},\"td-has-header\":{description:\"Ensure that each non-empty data cell in a large table has one or more table headers\",help:\"All non-empty td element in table larger than 3 by 3 must have an associated table header\"},\"td-headers-attr\":{description:\"Ensure that each cell in a table using the headers refers to another cell in that table\",help:\"All cells in a table element that use the headers attribute must only refer to other cells of that same table\"},\"th-has-data-cells\":{description:\"Ensure that each table header in a data table refers to data cells\",help:\"All th elements and elements with role=columnheader/rowheader must have data cells they describe\"},\"valid-lang\":{description:\"Ensures lang attributes have valid values\",help:\"lang attribute must have a valid value\"},\"video-caption\":{description:\"Ensures <video> elements have captions\",help:\"<video> elements must have captions\"},\"video-description\":{description:\"Ensures <video> elements have audio descriptions\",help:\"<video> elements must have an audio description track\"}},checks:{accesskeys:{impact:\"serious\",messages:{pass:function(a){return\"Accesskey attribute value is unique\"},fail:function(a){return\"Document has multiple elements with the same accesskey\"}}},\"non-empty-alt\":{impact:\"critical\",messages:{pass:function(a){return\"Element has a non-empty alt attribute\"},fail:function(a){return\"Element has no alt attribute or the alt attribute is empty\"}}},\"non-empty-title\":{impact:\"serious\",messages:{pass:function(a){return\"Element has a title attribute\"},fail:function(a){return\"Element has no title attribute or the title attribute is empty\"}}},\"aria-label\":{impact:\"serious\",messages:{pass:function(a){return\"aria-label attribute exists and is not empty\"},fail:function(a){return\"aria-label attribute does not exist or is empty\"}}},\"aria-labelledby\":{impact:\"serious\",messages:{pass:function(a){return\"aria-labelledby attribute exists and references elements that are visible to screen readers\"},fail:function(a){return\"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty or not visible\"}}},\"aria-allowed-attr\":{impact:\"critical\",messages:{pass:function(a){return\"ARIA attributes are used correctly for the defined role\"},fail:function(a){var b=\"ARIA attribute\"+(a.data&&a.data.length>1?\"s are\":\" is\")+\" not allowed:\",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\" \"+d;return b}}},\"aria-hidden-body\":{impact:\"critical\",messages:{pass:function(a){return\"No aria-hidden attribute is present on document body\"},fail:function(a){return\"aria-hidden=true should not be present on the document body\"}}},\"aria-required-attr\":{impact:\"critical\",messages:{pass:function(a){return\"All required ARIA attributes are present\"},fail:function(a){var b=\"Required ARIA attribute\"+(a.data&&a.data.length>1?\"s\":\"\")+\" not present:\",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\" \"+d;return b}}},\"aria-required-children\":{impact:\"critical\",messages:{pass:function(a){return\"Required ARIA children are present\"},fail:function(a){var b=\"Required ARIA \"+(a.data&&a.data.length>1?\"children\":\"child\")+\" role not present:\",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\" \"+d;return b}}},\"aria-required-parent\":{impact:\"critical\",messages:{pass:function(a){return\"Required ARIA parent role present\"},fail:function(a){var b=\"Required ARIA parent\"+(a.data&&a.data.length>1?\"s\":\"\")+\" role not present:\",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\" \"+d;return b}}},invalidrole:{impact:\"critical\",messages:{pass:function(a){return\"ARIA role is valid\"},fail:function(a){return\"Role must be one of the valid ARIA roles\"}}},abstractrole:{impact:\"serious\",messages:{pass:function(a){return\"Abstract roles are not used\"},fail:function(a){return\"Abstract roles cannot be directly used\"}}},\"aria-valid-attr-value\":{impact:\"critical\",messages:{pass:function(a){return\"ARIA attribute values are valid\"},fail:function(a){var b=\"Invalid ARIA attribute value\"+(a.data&&a.data.length>1?\"s\":\"\")+\":\",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\" \"+d;return b}}},\"aria-errormessage\":{impact:\"critical\",messages:{pass:function(a){return\"Uses a supported aria-errormessage technique\"},fail:function(a){var b=\"aria-errormessage value\"+(a.data&&a.data.length>1?\"s\":\"\")+\" \",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\" `\"+d;return b+=\"` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)\"}}},\"aria-valid-attr\":{impact:\"critical\",messages:{pass:function(a){return\"ARIA attribute name\"+(a.data&&a.data.length>1?\"s\":\"\")+\" are valid\"},fail:function(a){var b=\"Invalid ARIA attribute name\"+(a.data&&a.data.length>1?\"s\":\"\")+\":\",c=a.data;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\" \"+d;return b}}},caption:{impact:\"critical\",messages:{pass:function(a){return\"The multimedia element has a captions track\"},fail:function(a){return\"The multimedia element does not have a captions track\"},incomplete:function(a){return\"A captions track for this element could not be found\"}}},\"is-on-screen\":{impact:\"serious\",messages:{pass:function(a){return\"Element is not visible\"},fail:function(a){return\"Element is visible\"}}},\"non-empty-if-present\":{impact:\"critical\",messages:{pass:function(a){var b=\"Element \";return a.data?b+=\"has a non-empty value attribute\":b+=\"does not have a value attribute\",b},fail:function(a){return\"Element has a value attribute and the value attribute is empty\"}}},\"non-empty-value\":{impact:\"critical\",messages:{pass:function(a){return\"Element has a non-empty value attribute\"},fail:function(a){return\"Element has no value attribute or the value attribute is empty\"}}},\"button-has-visible-text\":{impact:\"critical\",messages:{pass:function(a){return\"Element has inner text that is visible to screen readers\"},fail:function(a){return\"Element does not have inner text that is visible to screen readers\"}}},\"role-presentation\":{impact:\"minor\",messages:{pass:function(a){return'Element\\'s default semantics were overriden with role=\"presentation\"'},fail:function(a){return'Element\\'s default semantics were not overridden with role=\"presentation\"'}}},\"role-none\":{impact:\"minor\",messages:{pass:function(a){return'Element\\'s default semantics were overriden with role=\"none\"'},fail:function(a){return'Element\\'s default semantics were not overridden with role=\"none\"'}}},\"focusable-no-name\":{impact:\"serious\",messages:{pass:function(a){return\"Element is not in tab order or has accessible text\"},fail:function(a){return\"Element is in tab order and does not have accessible text\"}}},\"internal-link-present\":{impact:\"serious\",messages:{pass:function(a){return\"Valid skip link found\"},fail:function(a){return\"No valid skip link found\"}}},\"header-present\":{impact:\"serious\",messages:{pass:function(a){return\"Page has a header\"},fail:function(a){return\"Page does not have a header\"}}},landmark:{impact:\"serious\",messages:{pass:function(a){return\"Page has a landmark region\"},fail:function(a){return\"Page does not have a landmark region\"}}},\"group-labelledby\":{impact:\"critical\",messages:{pass:function(a){return'All elements with the name \"'+a.data.name+'\" reference the same element with aria-labelledby'},fail:function(a){return'All elements with the name \"'+a.data.name+'\" do not reference the same element with aria-labelledby'}}},fieldset:{impact:\"critical\",messages:{pass:function(a){return\"Element is contained in a fieldset\"},fail:function(a){var b=\"\",c=a.data&&a.data.failureCode;return b+=\"no-legend\"===c?\"Fieldset does not have a legend as its first child\":\"empty-legend\"===c?\"Legend does not have text that is visible to screen readers\":\"mixed-inputs\"===c?\"Fieldset contains unrelated inputs\":\"no-group-label\"===c?\"ARIA group does not have aria-label or aria-labelledby\":\"group-mixed-inputs\"===c?\"ARIA group contains unrelated inputs\":\"Element does not have a containing fieldset or ARIA group\"}}},\"color-contrast\":{impact:\"serious\",messages:{pass:function(a){return\"Element has sufficient color contrast of \"+a.data.contrastRatio},fail:function(a){return\"Element has insufficient color contrast of \"+a.data.contrastRatio+\" (foreground color: \"+a.data.fgColor+\", background color: \"+a.data.bgColor+\", font size: \"+a.data.fontSize+\", font weight: \"+a.data.fontWeight+\"). Expected contrast ratio of \"+a.data.expectedContrastRatio},incomplete:{bgImage:\"Element's background color could not be determined due to a background image\",bgGradient:\"Element's background color could not be determined due to a background gradient\",imgNode:\"Element's background color could not be determined because element contains an image node\",bgOverlap:\"Element's background color could not be determined because it is overlapped by another element\",fgAlpha:\"Element's foreground color could not be determined because of alpha transparency\",elmPartiallyObscured:\"Element's background color could not be determined because it's partially obscured by another element\",elmPartiallyObscuring:\"Element's background color could not be determined because it partially overlaps other elements\",outsideViewport:\"Element's background color could not be determined because it's outside the viewport\",equalRatio:\"Element has a 1:1 contrast ratio with the background\",default:\"Unable to determine contrast ratio\"}}},\"structured-dlitems\":{impact:\"serious\",messages:{pass:function(a){return\"When not empty, element has both <dt> and <dd> elements\"},fail:function(a){return\"When not empty, element does not have at least one <dt> element followed by at least one <dd> element\"}}},\"only-dlitems\":{impact:\"serious\",messages:{pass:function(a){return\"List element only has direct children that are allowed inside <dt> or <dd> elements\"},fail:function(a){return\"List element has direct children that are not allowed inside <dt> or <dd> elements\"}}},dlitem:{impact:\"serious\",messages:{pass:function(a){return\"Description list item has a <dl> parent element\"},fail:function(a){return\"Description list item does not have a <dl> parent element\"}}},\"doc-has-title\":{impact:\"serious\",messages:{pass:function(a){return\"Document has a non-empty <title> element\"},fail:function(a){return\"Document does not have a non-empty <title> element\"}}},\"duplicate-id\":{impact:\"moderate\",messages:{pass:function(a){return\"Document has no elements that share the same id attribute\"},fail:function(a){return\"Document has multiple elements with the same id attribute: \"+a.data}}},\"has-visible-text\":{impact:\"minor\",messages:{pass:function(a){return\"Element has text that is visible to screen readers\"},fail:function(a){return\"Element does not have text that is visible to screen readers\"}}},\"has-widget-role\":{impact:\"minor\",messages:{pass:function(a){return\"Element has a widget role.\"},fail:function(a){return\"Element does not have a widget role.\"}}},\"valid-scrollable-semantics\":{impact:\"minor\",messages:{pass:function(a){return\"Element has valid semantics for an element in the focus order.\"},fail:function(a){return\"Element has invalid semantics for an element in the focus order.\"}}},\"unique-frame-title\":{impact:\"serious\",messages:{pass:function(a){return\"Element's title attribute is unique\"},fail:function(a){return\"Element's title attribute is not unique\"}}},\"heading-order\":{impact:\"moderate\",messages:{pass:function(a){return\"Heading order valid\"},fail:function(a){return\"Heading order invalid\"}}},\"hidden-content\":{impact:\"minor\",messages:{pass:function(a){return\"All content on the page has been analyzed.\"},fail:function(a){return\"There were problems analyzing the content on this page.\"},incomplete:function(a){return\"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.\"}}},\"has-lang\":{impact:\"serious\",messages:{pass:function(a){return\"The <html> element has a lang attribute\"},fail:function(a){return\"The <html> element does not have a lang attribute\"}}},\"valid-lang\":{impact:\"serious\",messages:{pass:function(a){return\"Value of lang attribute is included in the list of valid languages\"},fail:function(a){return\"Value of lang attribute not included in the list of valid languages\"}}},\"has-alt\":{impact:\"critical\",messages:{pass:function(a){return\"Element has an alt attribute\"},fail:function(a){return\"Element does not have an alt attribute\"}}},\"duplicate-img-label\":{impact:\"minor\",messages:{pass:function(a){return\"Element does not duplicate existing text in <img> alt text\"},fail:function(a){return\"Element contains <img> element with alt text that duplicates existing text\"}}},\"title-only\":{impact:\"serious\",messages:{pass:function(a){return\"Form element does not solely use title attribute for its label\"},fail:function(a){return\"Only title used to generate label for form element\"}}},\"implicit-label\":{impact:\"critical\",messages:{pass:function(a){return\"Form element has an implicit (wrapped) <label>\"},fail:function(a){return\"Form element does not have an implicit (wrapped) <label>\"}}},\"explicit-label\":{impact:\"critical\",messages:{pass:function(a){return\"Form element has an explicit <label>\"},fail:function(a){return\"Form element does not have an explicit <label>\"}}},\"help-same-as-label\":{impact:\"minor\",messages:{pass:function(a){return\"Help text (title or aria-describedby) does not duplicate label text\"},fail:function(a){return\"Help text (title or aria-describedby) text is the same as the label text\"}}},\"multiple-label\":{impact:\"serious\",messages:{pass:function(a){return\"Form element does not have multiple <label> elements\"},fail:function(a){return\"Form element has multiple <label> elements\"}}},\"main-is-top-level\":{impact:\"moderate\",messages:{pass:function(a){return\"The main landmark is at the top level.\"},fail:function(a){return\"The main landmark is contained in another landmark.\"}}},\"has-at-least-one-main\":{impact:\"moderate\",messages:{pass:function(a){return\"Document has at least one main landmark\"},fail:function(a){return\"Document has no main landmarks\"}}},\"has-no-more-than-one-main\":{impact:\"moderate\",messages:{pass:function(a){return\"Document has no more than one main landmark\"},fail:function(a){return\"Document has more than one main landmark\"}}},\"has-th\":{impact:\"serious\",messages:{pass:function(a){return\"Layout table does not use <th> elements\"},fail:function(a){return\"Layout table uses <th> elements\"}}},\"has-caption\":{impact:\"serious\",messages:{pass:function(a){return\"Layout table does not use <caption> element\"},fail:function(a){return\"Layout table uses <caption> element\"}}},\"has-summary\":{impact:\"serious\",messages:{pass:function(a){return\"Layout table does not use summary attribute\"},fail:function(a){return\"Layout table uses summary attribute\"}}},\"link-in-text-block\":{impact:\"serious\",messages:{pass:function(a){return\"Links can be distinguished from surrounding text in some way other than by color\"},fail:function(a){return\"Links need to be distinguished from surrounding text in some way other than by color\"},incomplete:{bgContrast:\"Element's contrast ratio could not be determined. Check for a distinct hover/focus style\",bgImage:\"Element's contrast ratio could not be determined due to a background image\",bgGradient:\"Element's contrast ratio could not be determined due to a background gradient\",imgNode:\"Element's contrast ratio could not be determined because element contains an image node\",bgOverlap:\"Element's contrast ratio could not be determined because of element overlap\",default:\"Unable to determine contrast ratio\"}}},\"only-listitems\":{impact:\"serious\",messages:{pass:function(a){return\"List element only has direct children that are allowed inside <li> elements\"},fail:function(a){return\"List element has direct children that are not allowed inside <li> elements\"}}},listitem:{impact:\"serious\",messages:{pass:function(a){return'List item has a <ul>, <ol> or role=\"list\" parent element'},fail:function(a){return'List item does not have a <ul>, <ol> or role=\"list\" parent element'}}},\"meta-refresh\":{impact:\"critical\",messages:{pass:function(a){return\"<meta> tag does not immediately refresh the page\"},fail:function(a){return\"<meta> tag forces timed refresh of page\"}}},\"meta-viewport-large\":{impact:\"minor\",messages:{pass:function(a){\nreturn\"<meta> tag does not prevent significant zooming on mobile devices\"},fail:function(a){return\"<meta> tag limits zooming on mobile devices\"}}},\"meta-viewport\":{impact:\"critical\",messages:{pass:function(a){return\"<meta> tag does not disable zooming on mobile devices\"},fail:function(a){return\"<meta> tag disables zooming on mobile devices\"}}},\"p-as-heading\":{impact:\"serious\",messages:{pass:function(a){return\"<p> elements are not styled as headings\"},fail:function(a){return\"Heading elements should be used instead of styled p elements\"}}},region:{impact:\"moderate\",messages:{pass:function(a){return\"Content contained by ARIA landmark\"},fail:function(a){return\"Content not contained by an ARIA landmark\"}}},\"html5-scope\":{impact:\"moderate\",messages:{pass:function(a){return\"Scope attribute is only used on table header elements (<th>)\"},fail:function(a){return\"In HTML 5, scope attributes may only be used on table header elements (<th>)\"}}},\"scope-value\":{impact:\"critical\",messages:{pass:function(a){return\"Scope attribute is used correctly\"},fail:function(a){return\"The value of the scope attribute may only be 'row' or 'col'\"}}},exists:{impact:\"minor\",messages:{pass:function(a){return\"Element does not exist\"},fail:function(a){return\"Element exists\"}}},\"skip-link\":{impact:\"moderate\",messages:{pass:function(a){return\"Skip link target exists\"},incomplete:function(a){return\"Skip link target should become visible on activation\"},fail:function(a){return\"No skip link target\"}}},tabindex:{impact:\"serious\",messages:{pass:function(a){return\"Element does not have a tabindex greater than 0\"},fail:function(a){return\"Element has a tabindex greater than 0\"}}},\"same-caption-summary\":{impact:\"minor\",messages:{pass:function(a){return\"Content of summary attribute and <caption> are not duplicated\"},fail:function(a){return\"Content of summary attribute and <caption> element are identical\"}}},\"caption-faked\":{impact:\"serious\",messages:{pass:function(a){return\"The first row of a table is not used as a caption\"},fail:function(a){return\"The first row of the table should be a caption instead of a table cell\"}}},\"td-has-header\":{impact:\"critical\",messages:{pass:function(a){return\"All non-empty data cells have table headers\"},fail:function(a){return\"Some non-empty data cells do not have table headers\"}}},\"td-headers-attr\":{impact:\"serious\",messages:{pass:function(a){return\"The headers attribute is exclusively used to refer to other cells in the table\"},fail:function(a){return\"The headers attribute is not exclusively used to refer to other cells in the table\"}}},\"th-has-data-cells\":{impact:\"serious\",messages:{pass:function(a){return\"All table header cells refer to data cells\"},fail:function(a){return\"Not all table header cells refer to data cells\"},incomplete:function(a){return\"Table data cells are missing or empty\"}}},description:{impact:\"critical\",messages:{pass:function(a){return\"The multimedia element has an audio description track\"},fail:function(a){return\"The multimedia element does not have an audio description track\"},incomplete:function(a){return\"An audio description track for this element could not be found\"}}}},failureSummaries:{any:{failureMessage:function(a){var b=\"Fix any of the following:\",c=a;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\"\\n  \"+d.split(\"\\n\").join(\"\\n  \");return b}},none:{failureMessage:function(a){var b=\"Fix all of the following:\",c=a;if(c)for(var d,e=-1,f=c.length-1;e<f;)d=c[e+=1],b+=\"\\n  \"+d.split(\"\\n\").join(\"\\n  \");return b}}},incompleteFallbackMessage:function(a){return\"aXe couldn't tell the reason. Time to break out the element inspector!\"}},rules:[{id:\"accesskeys\",selector:\"[accesskey]\",excludeHidden:!1,tags:[\"wcag2a\",\"wcag211\",\"cat.keyboard\"],all:[],any:[],none:[\"accesskeys\"]},{id:\"area-alt\",selector:\"map area[href]\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"non-empty-title\",\"aria-label\",\"aria-labelledby\"],none:[]},{id:\"aria-allowed-attr\",matches:function(a,b){var c=a.getAttribute(\"role\");c||(c=axe.commons.aria.implicitRole(a));var d=axe.commons.aria.allowedAttr(c);if(c&&d){var e=/^aria-/;if(a.hasAttributes())for(var f=a.attributes,g=0,h=f.length;g<h;g++)if(e.test(f[g].name))return!0}return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag411\",\"wcag412\"],all:[],any:[\"aria-allowed-attr\"],none:[]},{id:\"aria-hidden-body\",selector:\"body\",excludeHidden:!1,tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-hidden-body\"],none:[]},{id:\"aria-required-attr\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag411\",\"wcag412\"],all:[],any:[\"aria-required-attr\"],none:[]},{id:\"aria-required-children\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[\"aria-required-children\"],none:[]},{id:\"aria-required-parent\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[\"aria-required-parent\"],none:[]},{id:\"aria-roles\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\",\"wcag411\",\"wcag412\"],all:[],any:[],none:[\"invalidrole\",\"abstractrole\"]},{id:\"aria-valid-attr-value\",matches:function(a,b){var c=/^aria-/;if(a.hasAttributes())for(var d=a.attributes,e=0,f=d.length;e<f;e++)if(c.test(d[e].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag131\",\"wcag411\",\"wcag412\"],all:[{options:[],id:\"aria-valid-attr-value\"},\"aria-errormessage\"],any:[],none:[]},{id:\"aria-valid-attr\",matches:function(a,b){var c=/^aria-/;if(a.hasAttributes())for(var d=a.attributes,e=0,f=d.length;e<f;e++)if(c.test(d[e].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag411\"],all:[],any:[{options:[],id:\"aria-valid-attr\"}],none:[]},{id:\"audio-caption\",selector:\"audio\",excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag121\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"blink\",selector:\"blink\",excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag222\",\"section508\",\"section508.22.j\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"button-name\",selector:'button, [role=\"button\"], input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-if-present\",\"non-empty-value\",\"button-has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\"],none:[\"focusable-no-name\"]},{id:\"bypass\",selector:\"html\",pageLevel:!0,matches:function(a,b){return!!a.querySelector(\"a[href]\")},tags:[\"cat.keyboard\",\"wcag2a\",\"wcag241\",\"section508\",\"section508.22.o\"],all:[],any:[\"internal-link-present\",\"header-present\",\"landmark\"],none:[]},{id:\"checkboxgroup\",selector:\"input[type=checkbox][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"color-contrast\",matches:function(a,b){var c=a.nodeName.toUpperCase(),d=a.type;if(\"true\"===a.getAttribute(\"aria-disabled\")||axe.commons.dom.findUpVirtual(b,'[aria-disabled=\"true\"]'))return!1;if(\"INPUT\"===c)return-1===[\"hidden\",\"range\",\"color\",\"checkbox\",\"radio\",\"image\"].indexOf(d)&&!a.disabled;if(\"SELECT\"===c)return!!a.options.length&&!a.disabled;if(\"TEXTAREA\"===c)return!a.disabled;if(\"OPTION\"===c)return!1;if(\"BUTTON\"===c&&a.disabled||axe.commons.dom.findUpVirtual(b,\"button[disabled]\"))return!1;if(\"FIELDSET\"===c&&a.disabled||axe.commons.dom.findUpVirtual(b,\"fieldset[disabled]\"))return!1;var e=axe.commons.dom.findUpVirtual(b,\"label\");if(\"LABEL\"===c||e){var f=a,g=b;e&&(f=e,g=axe.utils.getNodeFromTree(axe._tree[0],e));var h=axe.commons.dom.getRootNode(f),i=f.htmlFor&&h.getElementById(f.htmlFor);if(i&&i.disabled)return!1;var i=axe.utils.querySelectorAll(g,'input:not([type=\"hidden\"]):not([type=\"image\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), select, textarea');if(i.length&&i[0].actualNode.disabled)return!1}if(a.getAttribute(\"id\")){var j=axe.commons.utils.escapeSelector(a.getAttribute(\"id\")),k=axe.commons.dom.getRootNode(a),i=k.querySelector(\"[aria-labelledby~=\"+j+\"]\");if(i&&i.disabled)return!1}if(\"\"===axe.commons.text.visibleVirtual(b,!1,!0))return!1;var l,m,n=document.createRange(),o=b.children,p=o.length;for(m=0;m<p;m++)l=o[m],3===l.actualNode.nodeType&&\"\"!==axe.commons.text.sanitize(l.actualNode.nodeValue)&&n.selectNodeContents(l.actualNode);var q=n.getClientRects();for(p=q.length,m=0;m<p;m++)if(axe.commons.dom.visuallyOverlaps(q[m],a))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:[\"cat.color\",\"wcag2aa\",\"wcag143\"],all:[],any:[\"color-contrast\"],none:[]},{id:\"definition-list\",selector:\"dl\",matches:function(a,b){return!a.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"structured-dlitems\",\"only-dlitems\"]},{id:\"dlitem\",selector:\"dd, dt\",matches:function(a,b){return!a.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"dlitem\"],none:[]},{id:\"document-title\",selector:\"html\",matches:function(a,b){return a.ownerDocument.defaultView.self===a.ownerDocument.defaultView.top},tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag242\"],all:[],any:[\"doc-has-title\"],none:[]},{id:\"duplicate-id\",selector:\"[id]\",excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id\"],none:[]},{id:\"empty-heading\",selector:'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',matches:function(a,b){var c=void 0;return a.hasAttribute(\"role\")&&(c=a.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),c&&c.length>0?c.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(a)},tags:[\"cat.name-role-value\",\"best-practice\"],all:[],any:[\"has-visible-text\"],none:[]},{id:\"focus-order-semantics\",selector:\"div, h1, h2, h3, h4, h5, h6, [role=heading], p, span\",matches:function(a,b){return axe.commons.dom.insertedIntoFocusOrder(a)},tags:[\"cat.keyboard\",\"best-practice\",\"experimental\"],all:[],any:[{options:[],id:\"has-widget-role\"},{options:[],id:\"valid-scrollable-semantics\"}],none:[]},{id:\"frame-title-unique\",selector:\"frame[title], iframe[title]\",matches:function(a,b){var c=a.getAttribute(\"title\");return!!(c?axe.commons.text.sanitize(c).trim():\"\")},tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"unique-frame-title\"]},{id:\"frame-title\",selector:\"frame, iframe\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag241\",\"section508\",\"section508.22.i\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"heading-order\",selector:\"h1, h2, h3, h4, h5, h6, [role=heading]\",matches:function(a,b){var c=void 0;return a.hasAttribute(\"role\")&&(c=a.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),c&&c.length>0?c.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(a)},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"heading-order\"],none:[]},{id:\"hidden-content\",selector:\"*\",excludeHidden:!1,tags:[\"experimental\",\"review-item\"],all:[],any:[\"hidden-content\"],none:[]},{id:\"html-has-lang\",selector:\"html\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[\"has-lang\"],none:[]},{id:\"html-lang-valid\",selector:\"html[lang]\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"image-alt\",selector:\"img, [role='img']:not(svg)\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"image-redundant-alt\",selector:'button, [role=\"button\"], a[href], p, li, td, th',tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"duplicate-img-label\"]},{id:\"input-image-alt\",selector:'input[type=\"image\"]',tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"label-title-only\",selector:\"input, select, textarea\",matches:function(a,b){return\"input\"!==a.nodeName.toLowerCase()||!1===a.hasAttribute(\"type\")||!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(a.getAttribute(\"type\").toLowerCase())},tags:[\"cat.forms\",\"best-practice\"],all:[],any:[],none:[\"title-only\"]},{id:\"label\",selector:\"input, select, textarea\",matches:function(a,b){return\"input\"!==a.nodeName.toLowerCase()||!1===a.hasAttribute(\"type\")||!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(a.getAttribute(\"type\").toLowerCase())},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\",\"wcag131\",\"section508\",\"section508.22.n\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"implicit-label\",\"explicit-label\",\"non-empty-title\"],none:[\"help-same-as-label\",\"multiple-label\"]},{id:\"landmark-main-is-top-level\",selector:\"main, [role=main]\",tags:[\"best-practice\"],all:[],any:[\"main-is-top-level\"],none:[]},{id:\"landmark-one-main\",selector:\"html\",tags:[\"best-practice\"],all:[\"has-at-least-one-main\",\"has-no-more-than-one-main\"],any:[],none:[]},{id:\"layout-table\",selector:\"table\",matches:function(a,b){return!axe.commons.table.isDataTable(a)},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"has-th\",\"has-caption\",\"has-summary\"]},{id:\"link-in-text-block\",selector:\"a[href], [role=link]\",matches:function(a,b){var c=axe.commons.text.sanitize(a.textContent),d=a.getAttribute(\"role\");return(!d||\"link\"===d)&&(!!c&&(!!axe.commons.dom.isVisible(a,!1)&&axe.commons.dom.isInTextBlock(a)))},excludeHidden:!1,tags:[\"cat.color\",\"experimental\",\"wcag2a\",\"wcag141\"],all:[\"link-in-text-block\"],any:[],none:[]},{id:\"link-name\",selector:\"a[href], [role=link][href]\",matches:function(a,b){return\"button\"!==a.getAttribute(\"role\")},tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag111\",\"wcag412\",\"wcag244\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\"],none:[\"focusable-no-name\"]},{id:\"list\",selector:\"ul, ol\",matches:function(a,b){return!a.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"only-listitems\"]},{id:\"listitem\",selector:\"li\",matches:function(a,b){return!a.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"listitem\"],none:[]},{id:\"marquee\",selector:\"marquee\",excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag222\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"meta-refresh\",selector:'meta[http-equiv=\"refresh\"]',excludeHidden:!1,tags:[\"cat.time\",\"wcag2a\",\"wcag2aaa\",\"wcag221\",\"wcag224\",\"wcag325\"],all:[],any:[\"meta-refresh\"],none:[]},{id:\"meta-viewport-large\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"best-practice\"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:\"meta-viewport-large\"}],none:[]},{id:\"meta-viewport\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"wcag2aa\",\"wcag144\"],all:[],any:[{options:{scaleMinimum:2},id:\"meta-viewport\"}],none:[]},{id:\"object-alt\",selector:\"object\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"p-as-heading\",selector:\"p\",matches:function(a,b){var c=Array.from(a.parentNode.childNodes),d=a.textContent.trim(),e=/[.!?:;](?![.!?:;])/g;return!(0===d.length||(d.match(e)||[]).length>=2)&&0!==c.slice(c.indexOf(a)+1).filter(function(a){return\"P\"===a.nodeName.toUpperCase()&&\"\"!==a.textContent.trim()}).length},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\",\"experimental\"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:\"p-as-heading\"}],any:[],none:[]},{id:\"radiogroup\",selector:\"input[type=radio][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"region\",selector:\"html\",pageLevel:!0,tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"region\"],none:[]},{id:\"scope-attr-valid\",selector:\"td[scope], th[scope]\",tags:[\"cat.tables\",\"best-practice\"],all:[\"html5-scope\",\"scope-value\"],any:[],none:[]},{id:\"server-side-image-map\",selector:\"img[ismap]\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag211\",\"section508\",\"section508.22.f\"],all:[],any:[],none:[\"exists\"]},{id:\"skip-link\",selector:\"a[href]\",matches:function(a,b){var c=a.getAttribute(\"href\");return\"#\"===c[0]&&c.length>1},tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"skip-link\"],none:[]},{id:\"tabindex\",selector:\"[tabindex]\",tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"tabindex\"],none:[]},{id:\"table-duplicate-name\",selector:\"table\",tags:[\"cat.tables\",\"best-practice\"],all:[],any:[],none:[\"same-caption-summary\"]},{id:\"table-fake-caption\",selector:\"table\",matches:function(a,b){return axe.commons.table.isDataTable(a)},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"caption-faked\"],any:[],none:[]},{id:\"td-has-header\",selector:\"table\",matches:function(a,b){if(axe.commons.table.isDataTable(a)){var c=axe.commons.table.toArray(a);return c.length>=3&&c[0].length>=3&&c[1].length>=3&&c[2].length>=3}return!1},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-has-header\"],any:[],none:[]},{id:\"td-headers-attr\",selector:\"table\",tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-headers-attr\"],any:[],none:[]},{id:\"th-has-data-cells\",selector:\"table\",matches:function(a,b){return axe.commons.table.isDataTable(a)},tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"th-has-data-cells\"],any:[],none:[]},{id:\"valid-lang\",selector:\"[lang], [xml\\\\:lang]\",matches:function(a,b){return\"html\"!==a.nodeName.toLowerCase()},tags:[\"cat.language\",\"wcag2aa\",\"wcag312\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"video-caption\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag122\",\"wcag123\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"video-description\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2aa\",\"wcag125\",\"section508\",\"section508.22.b\"],all:[],any:[],none:[\"description\"]}],checks:[{id:\"abstractrole\",evaluate:function(a,b,c){return\"abstract\"===axe.commons.aria.getRoleType(a.getAttribute(\"role\"))}},{id:\"aria-allowed-attr\",evaluate:function(a,b,c){b=b||{};var d,e,f,g=[],h=a.getAttribute(\"role\"),i=a.attributes;if(h||(h=axe.commons.aria.implicitRole(a)),f=axe.commons.aria.allowedAttr(h),Array.isArray(b[h])&&(f=axe.utils.uniqueArray(b[h].concat(f))),h&&f)for(var j=0,k=i.length;j<k;j++)d=i[j],e=d.name,axe.commons.aria.validateAttr(e)&&!f.includes(e)&&g.push(e+'=\"'+d.nodeValue+'\"');return!g.length||(this.data(g),!1)}},{id:\"aria-hidden-body\",evaluate:function(a,b,c){return\"true\"!==a.getAttribute(\"aria-hidden\")}},{id:\"aria-errormessage\",evaluate:function(a,b,c){b=Array.isArray(b)?b:[];var d=a.getAttribute(\"aria-errormessage\"),e=a.hasAttribute(\"aria-errormessage\"),f=axe.commons.dom.getRootNode(a);return!(-1===b.indexOf(d)&&e&&!function(){var b=d&&f.getElementById(d);if(b)return\"alert\"===b.getAttribute(\"role\")||\"assertive\"===b.getAttribute(\"aria-live\")||axe.utils.tokenList(a.getAttribute(\"aria-describedby\")||\"\").indexOf(d)>-1}())||(this.data(d),!1)}},{id:\"has-widget-role\",evaluate:function(a,b,c){var d=a.getAttribute(\"role\");if(null===d)return!1;var e=axe.commons.aria.getRoleType(d);return\"widget\"===e||\"composite\"===e},options:[]},{id:\"invalidrole\",evaluate:function(a,b,c){return!axe.commons.aria.isValidRole(a.getAttribute(\"role\"))}},{id:\"aria-required-attr\",evaluate:function(a,b,c){b=b||{};var d=[];if(a.hasAttributes()){var e,f=a.getAttribute(\"role\"),g=axe.commons.aria.requiredAttr(f);if(Array.isArray(b[f])&&(g=axe.utils.uniqueArray(b[f],g)),f&&g)for(var h=0,i=g.length;h<i;h++)e=g[h],a.getAttribute(e)||d.push(e)}return!d.length||(this.data(d),!1)}},{id:\"aria-required-children\",evaluate:function(a,b,c){function d(a,b,c,d){if(null===a)return!1;var e=g(c),f=['[role=\"'+c+'\"]'];return e&&(f=f.concat(e)),f=f.join(\",\"),d?h(a,f)||!!axe.utils.querySelectorAll(b,f)[0]:!!axe.utils.querySelectorAll(b,f)[0]}function e(a,b){var c,e;for(c=0,e=a.length;c<e;c++)if(null!==a[c]){var f=axe.utils.getNodeFromTree(axe._tree[0],a[c]);if(d(a[c],f,b,!0))return!0}return!1}var f=axe.commons.aria.requiredOwned,g=axe.commons.aria.implicitNodes,h=axe.commons.utils.matchesSelector,i=axe.commons.dom.idrefs,j=a.getAttribute(\"role\"),k=f(j);if(!k)return!0;var l=!1,m=k.one;if(!m){var l=!0;m=k.all}var n=function(a,b,f,g){var h,j=b.length,k=[],l=i(a,\"aria-owns\");for(h=0;h<j;h++){var m=b[h];if(d(a,c,m)||e(l,m)){if(!f)return null}else f&&k.push(m)}if(\"combobox\"===g){var n=k.indexOf(\"textbox\"),o=[\"text\",\"search\",\"email\",\"url\",\"tel\"];n>=0&&\"INPUT\"===a.tagName&&o.includes(a.type)&&k.splice(n,1);var p=k.indexOf(\"listbox\"),q=a.getAttribute(\"aria-expanded\");p>=0&&(!q||\"false\"===q)&&k.splice(p,1)}return k.length?k:!f&&b.length?b:null}(a,m,l,j);return!n||(this.data(n),!1)}},{id:\"aria-required-parent\",evaluate:function(a,b,c){function d(a){return(axe.commons.aria.implicitNodes(a)||[]).concat('[role=\"'+a+'\"]').join(\",\")}function e(a,b,c){var e,f,g=a.actualNode.getAttribute(\"role\"),h=[];if(b||(b=axe.commons.aria.requiredContext(g)),!b)return null;for(e=0,f=b.length;e<f;e++){if(c&&axe.utils.matchesSelector(a.actualNode,d(b[e])))return null;if(axe.commons.dom.findUpVirtual(a,d(b[e])))return null;h.push(b[e])}return h}var f=e(c);if(!f)return!0;var g=function(a){for(var b=[],c=null;a;){if(a.getAttribute(\"id\")){var d=axe.commons.utils.escapeSelector(a.getAttribute(\"id\"));c=axe.commons.dom.getRootNode(a).querySelector(\"[aria-owns~=\"+d+\"]\"),c&&b.push(c)}a=a.parentElement}return b.length?b:null}(a);if(g)for(var h=0,i=g.length;h<i;h++)if(!(f=e(axe.utils.getNodeFromTree(axe._tree[0],g[h]),f,!0)))return!0;return this.data(f),!1}},{id:\"aria-valid-attr-value\",evaluate:function(a,b,c){b=Array.isArray(b)?b:[];for(var d,e,f=[],g=/^aria-/,h=a.attributes,i=[\"aria-errormessage\"],j=0,k=h.length;j<k;j++)d=h[j],e=d.name,i.includes(e)||-1===b.indexOf(e)&&g.test(e)&&!axe.commons.aria.validateAttrValue(a,e)&&f.push(e+'=\"'+d.nodeValue+'\"');return!f.length||(this.data(f),!1)},options:[]},{id:\"aria-valid-attr\",evaluate:function(a,b,c){b=Array.isArray(b)?b:[];for(var d,e=[],f=/^aria-/,g=a.attributes,h=0,i=g.length;h<i;h++)d=g[h].name,-1===b.indexOf(d)&&f.test(d)&&!axe.commons.aria.validateAttr(d)&&e.push(d);return!e.length||(this.data(e),!1)},options:[]},{id:\"valid-scrollable-semantics\",evaluate:function(a,b,c){function d(a){var b=a.tagName.toUpperCase();return f[b]||!1}function e(a){var b=a.getAttribute(\"role\");return!!b&&(g[b.toLowerCase()]||!1)}var f={ARTICLE:!0,ASIDE:!0,NAV:!0,SECTION:!0},g={banner:!1,complementary:!0,contentinfo:!0,form:!0,main:!0,navigation:!0,region:!0,search:!1};return function(a){return e(a)||d(a)}(a)},options:[]},{id:\"color-contrast\",evaluate:function(a,b,c){if(!axe.commons.dom.isVisible(a,!1))return!0;var d,e=!!(b||{}).noScroll,f=[],g=axe.commons.color.getBackgroundColor(a,f,e),h=axe.commons.color.getForegroundColor(a,e),i=window.getComputedStyle(a),j=parseFloat(i.getPropertyValue(\"font-size\")),k=i.getPropertyValue(\"font-weight\"),l=-1!==[\"bold\",\"bolder\",\"600\",\"700\",\"800\",\"900\"].indexOf(k),m=axe.commons.color.hasValidContrastRatio(g,h,j,l),n=Math.floor(100*m.contrastRatio)/100;null===g&&(d=axe.commons.color.incompleteData.get(\"bgColor\"));var o=!1;1===n&&(o=!0,d=axe.commons.color.incompleteData.set(\"bgColor\",\"equalRatio\"));var p={fgColor:h?h.toHexString():void 0,bgColor:g?g.toHexString():void 0,contrastRatio:m?n:void 0,fontSize:(72*j/96).toFixed(1)+\"pt\",fontWeight:l?\"bold\":\"normal\",missingData:d,expectedContrastRatio:m.expectedContrastRatio+\":1\"};return this.data(p),null===h||null===g||o?(d=null,axe.commons.color.incompleteData.clear(),void this.relatedNodes(f)):(m.isValid||this.relatedNodes(f),m.isValid)}},{id:\"link-in-text-block\",evaluate:function(a,b,c){function d(a,b){var c=a.getRelativeLuminance(),d=b.getRelativeLuminance();return(Math.max(c,d)+.05)/(Math.min(c,d)+.05)}function e(a){var b=window.getComputedStyle(a).getPropertyValue(\"display\");return-1!==i.indexOf(b)||\"table-\"===b.substr(0,6)}var f=axe.commons,g=f.color,h=f.dom,i=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];if(e(a))return!1;for(var j=h.getComposedParent(a);1===j.nodeType&&!e(j);)j=h.getComposedParent(j);if(this.relatedNodes([j]),g.elementIsDistinct(a,j))return!0;var k,l;if(k=g.getForegroundColor(a),l=g.getForegroundColor(j),k&&l){var m=d(k,l);if(1===m)return!0;if(m>=3)return axe.commons.color.incompleteData.set(\"fgColor\",\"bgContrast\"),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear();if(k=g.getBackgroundColor(a),l=g.getBackgroundColor(j),!k||!l||d(k,l)>=3){var n=void 0;return n=k&&l?\"bgContrast\":axe.commons.color.incompleteData.get(\"bgColor\"),axe.commons.color.incompleteData.set(\"fgColor\",n),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear()}return!1}}},{id:\"fieldset\",evaluate:function(a,b,c){function d(a,b){return axe.commons.utils.toArray(a.querySelectorAll('select,textarea,button,input:not([name=\"'+b+'\"]):not([type=\"hidden\"])'))}function e(a,b){var c=a.firstElementChild;if(!c||\"LEGEND\"!==c.nodeName.toUpperCase())return i.relatedNodes([a]),h=\"no-legend\",!1;if(!axe.commons.text.accessibleText(c))return i.relatedNodes([c]),h=\"empty-legend\",!1;var e=d(a,b);return!e.length||(i.relatedNodes(e),h=\"mixed-inputs\",!1)}function f(a,b){var c=axe.commons.dom.idrefs(a,\"aria-labelledby\").some(function(a){return a&&axe.commons.text.accessibleText(a)}),e=a.getAttribute(\"aria-label\");if(!(c||e&&axe.commons.text.sanitize(e)))return i.relatedNodes(a),h=\"no-group-label\",!1;var f=d(a,b);return!f.length||(i.relatedNodes(f),h=\"group-mixed-inputs\",!1)}function g(a,b){return axe.commons.utils.toArray(a).filter(function(a){return a!==b})}var h,i=this,j={name:a.getAttribute(\"name\"),type:a.getAttribute(\"type\")},k=function(a){var b=axe.commons.utils.escapeSelector(a.actualNode.name),c=axe.commons.dom.getRootNode(a.actualNode),d=c.querySelectorAll('input[type=\"'+axe.commons.utils.escapeSelector(a.actualNode.type)+'\"][name=\"'+b+'\"]');if(d.length<2)return!0;var j=axe.commons.dom.findUpVirtual(a,\"fieldset\"),k=axe.commons.dom.findUpVirtual(a,'[role=\"group\"]'+(\"radio\"===a.actualNode.type?',[role=\"radiogroup\"]':\"\"));return k||j?j?e(j,b):f(k,b):(h=\"no-group\",i.relatedNodes(g(d,a.actualNode)),!1)}(c);return k||(j.failureCode=h),this.data(j),k},after:function(a,b){var c={};return a.filter(function(a){if(a.result)return!0;var b=a.data;if(b){if(c[b.type]=c[b.type]||{},!c[b.type][b.name])return c[b.type][b.name]=[b],!0;var d=c[b.type][b.name].some(function(a){return a.failureCode===b.failureCode});return d||c[b.type][b.name].push(b),!d}return!1})}},{id:\"group-labelledby\",evaluate:function(a,b,c){this.data({name:a.getAttribute(\"name\"),type:a.getAttribute(\"type\")});var d=axe.commons.dom.getRootNode(a),e=d.querySelectorAll('input[type=\"'+axe.commons.utils.escapeSelector(a.type)+'\"][name=\"'+axe.commons.utils.escapeSelector(a.name)+'\"]');return e.length<=1||0!==[].map.call(e,function(a){var b=a.getAttribute(\"aria-labelledby\");return b?b.split(/\\s+/):[]}).reduce(function(a,b){return a.filter(function(a){return b.includes(a)})}).filter(function(a){var b=d.getElementById(a);return b&&axe.commons.text.accessibleText(b,!0)}).length},after:function(a,b){var c={};return a.filter(function(a){var b=a.data;return!(!b||(c[b.type]=c[b.type]||{},c[b.type][b.name]))&&(c[b.type][b.name]=!0,!0)})}},{id:\"accesskeys\",evaluate:function(a,b,c){return axe.commons.dom.isVisible(a,!1)&&(this.data(a.getAttribute(\"accesskey\")),this.relatedNodes([a])),!0},after:function(a,b){var c={};return a.filter(function(a){if(!a.data)return!1;var b=a.data.toUpperCase();return c[b]?(c[b].relatedNodes.push(a.relatedNodes[0]),!1):(c[b]=a,a.relatedNodes=[],!0)}).map(function(a){return a.result=!!a.relatedNodes.length,a})}},{id:\"focusable-no-name\",evaluate:function(a,b,c){var d=a.getAttribute(\"tabindex\");return!!(axe.commons.dom.isFocusable(a)&&d>-1)&&!axe.commons.text.accessibleTextVirtual(c)}},{id:\"has-at-least-one-main\",evaluate:function(a,b,c){var d=axe.utils.querySelectorAll(c,\"main,[role=main]\");return this.data(!!d[0]),!!d[0]},after:function(a,b){for(var c=!1,d=0;d<a.length&&!c;d++)c=a[d].data;for(var d=0;d<a.length;d++)a[d].result=c;return a}},{id:\"has-no-more-than-one-main\",evaluate:function(a,b,c){return axe.utils.querySelectorAll(c,\"main,[role=main]\").length<=1}},{id:\"main-is-top-level\",evaluate:function(a,b,c){for(var d=axe.commons.aria.getRolesByType(\"landmark\"),e=axe.commons.dom.getComposedParent(a);e;){var f=e.getAttribute(\"role\");if(f||\"form\"===e.tagName.toLowerCase()||(f=axe.commons.aria.implicitRole(e)),f&&d.includes(f))return!1;e=axe.commons.dom.getComposedParent(e)}return!0}},{id:\"tabindex\",evaluate:function(a,b,c){return a.tabIndex<=0}},{id:\"duplicate-img-label\",evaluate:function(a,b,c){var d=axe.commons.text.visibleVirtual(c,!0).toLowerCase();return\"\"!==d&&axe.utils.querySelectorAll(c,\"img\").filter(function(a){var b=a.actualNode;return axe.commons.dom.isVisible(b)&&![\"none\",\"presentation\"].includes(b.getAttribute(\"role\"))}).some(function(a){return d===axe.commons.text.accessibleTextVirtual(a).toLowerCase()})}},{id:\"explicit-label\",evaluate:function(a,b,c){if(a.getAttribute(\"id\")){var d=axe.commons.dom.getRootNode(a),e=axe.commons.utils.escapeSelector(a.getAttribute(\"id\")),f=d.querySelector('label[for=\"'+e+'\"]');if(f)return!!axe.commons.text.accessibleText(f)}return!1}},{id:\"help-same-as-label\",evaluate:function(a,b,c){var d=axe.commons.text.labelVirtual(c),e=a.getAttribute(\"title\");if(!d)return!1;if(!e&&(e=\"\",a.getAttribute(\"aria-describedby\"))){e=axe.commons.dom.idrefs(a,\"aria-describedby\").map(function(a){return a?axe.commons.text.accessibleText(a):\"\"}).join(\"\")}return axe.commons.text.sanitize(e)===axe.commons.text.sanitize(d)},enabled:!1},{id:\"implicit-label\",evaluate:function(a,b,c){var d=axe.commons.dom.findUpVirtual(c,\"label\");return!!d&&!!axe.commons.text.accessibleTextVirtual(d)}},{id:\"multiple-label\",evaluate:function(a,b,c){var d=axe.commons.utils.escapeSelector(a.getAttribute(\"id\")),e=Array.from(document.querySelectorAll('label[for=\"'+d+'\"]')),f=a.parentNode;for(e.length&&(e=e.filter(function(a,b){if(0===b&&!axe.commons.dom.isVisible(a,!0)||axe.commons.dom.isVisible(a,!0))return a}));f;)\"LABEL\"===f.tagName&&-1===e.indexOf(f)&&e.push(f),f=f.parentNode;return this.relatedNodes(e),e.length>1}},{id:\"title-only\",evaluate:function(a,b,c){return!(axe.commons.text.labelVirtual(c)||!a.getAttribute(\"title\")&&!a.getAttribute(\"aria-describedby\"))}},{id:\"has-lang\",evaluate:function(a,b,c){return!!(a.getAttribute(\"lang\")||a.getAttribute(\"xml:lang\")||\"\").trim()}},{id:\"valid-lang\",evaluate:function(a,b,c){function d(a){return a.trim().split(\"-\")[0].toLowerCase()}var e,f;return e=(b||axe.commons.utils.validLangs()).map(d),f=[\"lang\",\"xml:lang\"].reduce(function(b,c){var f=a.getAttribute(c);if(\"string\"!=typeof f)return b;var g=d(f);return\"\"!==g&&-1===e.indexOf(g)&&b.push(c+'=\"'+a.getAttribute(c)+'\"'),b},[]),!!f.length&&(this.data(f),!0)}},{id:\"dlitem\",evaluate:function(a,b,c){return\"DL\"===axe.commons.dom.getComposedParent(a).nodeName.toUpperCase()}},{id:\"has-listitem\",evaluate:function(a,b,c){return c.children.every(function(a){return\"LI\"!==a.actualNode.nodeName.toUpperCase()})}},{id:\"listitem\",evaluate:function(a,b,c){var d=axe.commons.dom.getComposedParent(a);return[\"UL\",\"OL\"].includes(d.nodeName.toUpperCase())||\"list\"===(d.getAttribute(\"role\")||\"\").toLowerCase()}},{id:\"only-dlitems\",evaluate:function(a,b,c){var d=[],e=[\"STYLE\",\"META\",\"LINK\",\"MAP\",\"AREA\",\"SCRIPT\",\"DATALIST\",\"TEMPLATE\"],f=!1;return c.children.forEach(function(a){var b=a.actualNode,c=b.nodeName.toUpperCase();1===b.nodeType&&\"DT\"!==c&&\"DD\"!==c&&-1===e.indexOf(c)?d.push(b):3===b.nodeType&&\"\"!==b.nodeValue.trim()&&(f=!0)}),d.length&&this.relatedNodes(d),!!d.length||f}},{id:\"only-listitems\",evaluate:function(a,b,c){var d=[],e=[\"STYLE\",\"META\",\"LINK\",\"MAP\",\"AREA\",\"SCRIPT\",\"DATALIST\",\"TEMPLATE\"],f=!1;return c.children.forEach(function(a){var b=a.actualNode,c=b.nodeName.toUpperCase();1===b.nodeType&&\"LI\"!==c&&-1===e.indexOf(c)?d.push(b):3===b.nodeType&&\"\"!==b.nodeValue.trim()&&(f=!0)}),d.length&&this.relatedNodes(d),!!d.length||f}},{id:\"structured-dlitems\",\nevaluate:function(a,b,c){var d=c.children;if(!d||!d.length)return!1;for(var e,f=!1,g=!1,h=0;h<d.length;h++){if(e=d[h].actualNode.nodeName.toUpperCase(),\"DT\"===e&&(f=!0),f&&\"DD\"===e)return!1;\"DD\"===e&&(g=!0)}return f||g}},{id:\"caption\",evaluate:function(a,b,c){var d=axe.utils.querySelectorAll(c,\"track\");if(d.length)return!d.some(function(a){return\"captions\"===(a.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})}},{id:\"description\",evaluate:function(a,b,c){var d=axe.utils.querySelectorAll(c,\"track\");if(d.length){return!d.some(function(a){return\"descriptions\"===(a.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})}}},{id:\"meta-viewport-large\",evaluate:function(a,b,c){b=b||{};for(var d,e=a.getAttribute(\"content\")||\"\",f=e.split(/[;,]/),g={},h=b.scaleMinimum||2,i=b.lowerBound||!1,j=0,k=f.length;j<k;j++){d=f[j].split(\"=\");var l=d.shift().toLowerCase();l&&d.length&&(g[l.trim()]=d.shift().trim().toLowerCase())}return!!(i&&g[\"maximum-scale\"]&&parseFloat(g[\"maximum-scale\"])<i)||!(!i&&\"no\"===g[\"user-scalable\"])&&!(g[\"maximum-scale\"]&&parseFloat(g[\"maximum-scale\"])<h)},options:{scaleMinimum:5,lowerBound:2}},{id:\"meta-viewport\",evaluate:function(a,b,c){b=b||{};for(var d,e=a.getAttribute(\"content\")||\"\",f=e.split(/[;,]/),g={},h=b.scaleMinimum||2,i=b.lowerBound||!1,j=0,k=f.length;j<k;j++){d=f[j].split(\"=\");var l=d.shift().toLowerCase();l&&d.length&&(g[l.trim()]=d.shift().trim().toLowerCase())}return!!(i&&g[\"maximum-scale\"]&&parseFloat(g[\"maximum-scale\"])<i)||!(!i&&\"no\"===g[\"user-scalable\"])&&!(g[\"maximum-scale\"]&&parseFloat(g[\"maximum-scale\"])<h)},options:{scaleMinimum:2}},{id:\"header-present\",evaluate:function(a,b,c){return!!axe.utils.querySelectorAll(c,'h1, h2, h3, h4, h5, h6, [role=\"heading\"]')[0]}},{id:\"heading-order\",evaluate:function(a,b,c){var d=a.getAttribute(\"aria-level\");if(null!==d)return this.data(parseInt(d,10)),!0;var e=a.tagName.match(/H(\\d)/);return!e||(this.data(parseInt(e[1],10)),!0)},after:function(a,b){if(a.length<2)return a;for(var c=a[0].data,d=1;d<a.length;d++)a[d].result&&a[d].data>c+1&&(a[d].result=!1),c=a[d].data;return a}},{id:\"internal-link-present\",evaluate:function(a,b,c){return axe.utils.querySelectorAll(c,\"a[href]\").some(function(a){return\"#\"===a.actualNode.getAttribute(\"href\")[0]})}},{id:\"landmark\",evaluate:function(a,b,c){return axe.utils.querySelectorAll(c,'main, [role=\"main\"]').length>0}},{id:\"meta-refresh\",evaluate:function(a,b,c){var d=a.getAttribute(\"content\")||\"\",e=d.split(/[;,]/);return\"\"===d||\"0\"===e[0]}},{id:\"p-as-heading\",evaluate:function(a,b,c){function d(a){for(var b=a,c=a.textContent.trim(),d=c;d===c&&void 0!==b;){var e=-1;if(a=b,0===a.children.length)return a;do{e++,d=a.children[e].textContent.trim()}while(\"\"===d&&e+1<a.children.length);b=a.children[e]}return a}function e(a){switch(a){case\"lighter\":return 100;case\"normal\":return 400;case\"bold\":return 700;case\"bolder\":return 900}return a=parseInt(a),isNaN(a)?400:a}function f(a){var b=window.getComputedStyle(d(a));return{fontWeight:e(b.getPropertyValue(\"font-weight\")),fontSize:parseInt(b.getPropertyValue(\"font-size\")),isItalic:\"italic\"===b.getPropertyValue(\"font-style\")}}function g(a,b,c){return c.reduce(function(c,d){return c||(!d.size||a.fontSize/d.size>b.fontSize)&&(!d.weight||a.fontWeight-d.weight>b.fontWeight)&&(!d.italic||a.isItalic&&!b.isItalic)},!1)}var h=Array.from(a.parentNode.children),i=h.indexOf(a);b=b||{};var j=b.margins||[],k=h.slice(i+1).find(function(a){return\"P\"===a.nodeName.toUpperCase()}),l=h.slice(0,i).reverse().find(function(a){return\"P\"===a.nodeName.toUpperCase()}),m=f(a),n=k?f(k):null,o=l?f(l):null;if(!n||!g(m,n,j))return!0;var p=axe.commons.dom.findUpVirtual(c,\"blockquote\");return!!(p&&\"BLOCKQUOTE\"===p.nodeName.toUpperCase()||o&&!g(m,o,j))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:\"region\",evaluate:function(a,b,c){function d(a){return j&&j===a}function e(a){return a.hasAttribute(\"role\")?k.includes(a.getAttribute(\"role\").toLowerCase()):l.some(function(b){return axe.utils.matchesSelector(a,b)})}function f(a){var b=a.actualNode;return e(b)||d(b)||!h.isVisible(b,!0)?[]:h.hasContent(b,!0)?[b]:a.children.filter(function(a){return 1===a.actualNode.nodeType}).map(f).reduce(function(a,b){return a.concat(b)},[])}var g=axe.commons,h=g.dom,i=g.aria,j=function(a){var b=axe.utils.querySelectorAll(a,\"a[href]\")[0];if(b&&axe.commons.dom.getElementByReference(b.actualNode,\"href\"))return b.actualNode}(c),k=i.getRolesByType(\"landmark\"),l=k.reduce(function(a,b){return a.concat(i.implicitNodes(b))},[]).filter(function(a){return null!==a}),m=f(c);return this.relatedNodes(m),0===m.length},after:function(a,b){return[a[0]]}},{id:\"skip-link\",evaluate:function(a,b,c){var d=axe.commons.dom.getElementByReference(a,\"href\");return!!d&&(axe.commons.dom.isVisible(d,!0)||void 0)}},{id:\"unique-frame-title\",evaluate:function(a,b,c){var d=axe.commons.text.sanitize(a.title).trim().toLowerCase();return this.data(d),!0},after:function(a,b){var c={};return a.forEach(function(a){c[a.data]=void 0!==c[a.data]?++c[a.data]:0}),a.forEach(function(a){a.result=!!c[a.data]}),a}},{id:\"aria-label\",evaluate:function(a,b,c){var d=a.getAttribute(\"aria-label\");return!!(d?axe.commons.text.sanitize(d).trim():\"\")}},{id:\"aria-labelledby\",evaluate:function(a,b,c){return(0,axe.commons.dom.idrefs)(a,\"aria-labelledby\").some(function(a){return a&&axe.commons.text.accessibleText(a,!0)})}},{id:\"button-has-visible-text\",evaluate:function(a,b,c){var d=a.nodeName.toUpperCase(),e=a.getAttribute(\"role\"),f=void 0;return(\"BUTTON\"===d||\"button\"===e&&\"INPUT\"!==d)&&(f=axe.commons.text.accessibleTextVirtual(c),this.data(f),!!f)}},{id:\"doc-has-title\",evaluate:function(a,b,c){var d=document.title;return!!(d?axe.commons.text.sanitize(d).trim():\"\")}},{id:\"duplicate-id\",evaluate:function(a,b,c){var d=a.getAttribute(\"id\").trim();if(!d)return!0;var e=axe.commons.dom.getRootNode(a),f=Array.from(e.querySelectorAll('[id=\"'+axe.commons.utils.escapeSelector(d)+'\"]')).filter(function(b){return b!==a});return f.length&&this.relatedNodes(f),this.data(d),0===f.length},after:function(a,b){var c=[];return a.filter(function(a){return-1===c.indexOf(a.data)&&(c.push(a.data),!0)})}},{id:\"exists\",evaluate:function(a,b,c){return!0}},{id:\"has-alt\",evaluate:function(a,b,c){var d=a.nodeName.toLowerCase();return a.hasAttribute(\"alt\")&&(\"img\"===d||\"input\"===d||\"area\"===d)}},{id:\"has-visible-text\",evaluate:function(a,b,c){return axe.commons.text.accessibleTextVirtual(c).length>0}},{id:\"is-on-screen\",evaluate:function(a,b,c){return axe.commons.dom.isVisible(a,!1)&&!axe.commons.dom.isOffscreen(a)}},{id:\"non-empty-alt\",evaluate:function(a,b,c){var d=a.getAttribute(\"alt\");return!!(d?axe.commons.text.sanitize(d).trim():\"\")}},{id:\"non-empty-if-present\",evaluate:function(a,b,c){var d=a.nodeName.toUpperCase(),e=(a.getAttribute(\"type\")||\"\").toLowerCase(),f=a.getAttribute(\"value\");return this.data(f),!(\"INPUT\"!==d||![\"submit\",\"reset\"].includes(e))&&null===f}},{id:\"non-empty-title\",evaluate:function(a,b,c){var d=a.getAttribute(\"title\");return!!(d?axe.commons.text.sanitize(d).trim():\"\")}},{id:\"non-empty-value\",evaluate:function(a,b,c){var d=a.getAttribute(\"value\");return!!(d?axe.commons.text.sanitize(d).trim():\"\")}},{id:\"role-none\",evaluate:function(a,b,c){return\"none\"===a.getAttribute(\"role\")}},{id:\"role-presentation\",evaluate:function(a,b,c){return\"presentation\"===a.getAttribute(\"role\")}},{id:\"caption-faked\",evaluate:function(a,b,c){var d=axe.commons.table.toGrid(a),e=d[0];return d.length<=1||e.length<=1||a.rows.length<=1||e.reduce(function(a,b,c){return a||b!==e[c+1]&&void 0!==e[c+1]},!1)}},{id:\"has-caption\",evaluate:function(a,b,c){return!!a.caption}},{id:\"has-summary\",evaluate:function(a,b,c){return!!a.summary}},{id:\"has-th\",evaluate:function(a,b,c){for(var d,e,f=[],g=0,h=a.rows.length;g<h;g++){d=a.rows[g];for(var i=0,j=d.cells.length;i<j;i++)e=d.cells[i],\"TH\"!==e.nodeName.toUpperCase()&&-1===[\"rowheader\",\"columnheader\"].indexOf(e.getAttribute(\"role\"))||f.push(e)}return!!f.length&&(this.relatedNodes(f),!0)}},{id:\"html5-scope\",evaluate:function(a,b,c){return!axe.commons.dom.isHTML5(document)||\"TH\"===a.nodeName.toUpperCase()}},{id:\"same-caption-summary\",evaluate:function(a,b,c){return!(!a.summary||!a.caption)&&a.summary===axe.commons.text.accessibleText(a.caption)}},{id:\"scope-value\",evaluate:function(a,b,c){b=b||{};var d=a.getAttribute(\"scope\").toLowerCase();return-1!==([\"row\",\"col\",\"rowgroup\",\"colgroup\"]||b.values).indexOf(d)}},{id:\"td-has-header\",evaluate:function(a,b,c){var d=axe.commons.table,e=[];return d.getAllCells(a).forEach(function(a){if(axe.commons.dom.hasContent(a)&&d.isDataCell(a)&&!axe.commons.aria.label(a)){var b=d.getHeaders(a);(b=b.reduce(function(a,b){return a||null!==b&&!!axe.commons.dom.hasContent(b)},!1))||e.push(a)}}),!e.length||(this.relatedNodes(e),!1)}},{id:\"td-headers-attr\",evaluate:function(a,b,c){for(var d=[],e=0,f=a.rows.length;e<f;e++)for(var g=a.rows[e],h=0,i=g.cells.length;h<i;h++)d.push(g.cells[h]);var j=d.reduce(function(a,b){return b.getAttribute(\"id\")&&a.push(b.getAttribute(\"id\")),a},[]),k=d.reduce(function(a,b){var c,d,e=(b.getAttribute(\"headers\")||\"\").split(/\\s/).reduce(function(a,b){return b=b.trim(),b&&a.push(b),a},[]);return 0!==e.length&&(b.getAttribute(\"id\")&&(c=-1!==e.indexOf(b.getAttribute(\"id\").trim())),d=e.reduce(function(a,b){return a||-1===j.indexOf(b)},!1),(c||d)&&a.push(b)),a},[]);return!(k.length>0)||(this.relatedNodes(k),!1)}},{id:\"th-has-data-cells\",evaluate:function(a,b,c){var d=axe.commons.table,e=d.getAllCells(a),f=this,g=[];e.forEach(function(a){var b=a.getAttribute(\"headers\");b&&(g=g.concat(b.split(/\\s+/)));var c=a.getAttribute(\"aria-labelledby\");c&&(g=g.concat(c.split(/\\s+/)))});var h=e.filter(function(a){return\"\"!==axe.commons.text.sanitize(a.textContent)&&(\"TH\"===a.nodeName.toUpperCase()||-1!==[\"rowheader\",\"columnheader\"].indexOf(a.getAttribute(\"role\")))}),i=d.toGrid(a);return!!h.reduce(function(a,b){if(b.getAttribute(\"id\")&&g.includes(b.getAttribute(\"id\")))return!!a||a;var c=!1,e=d.getCellPosition(b,i);return d.isColumnHeader(b)&&(c=d.traverse(\"down\",e,i).reduce(function(a,b){return a||axe.commons.dom.hasContent(b)&&!d.isColumnHeader(b)},!1)),!c&&d.isRowHeader(b)&&(c=d.traverse(\"right\",e,i).reduce(function(a,b){return a||axe.commons.dom.hasContent(b)&&!d.isRowHeader(b)},!1)),c||f.relatedNodes(b),a&&c},!0)||void 0}},{id:\"hidden-content\",evaluate:function(a,b,c){if(![\"SCRIPT\",\"HEAD\",\"TITLE\",\"NOSCRIPT\",\"STYLE\",\"TEMPLATE\"].includes(a.tagName.toUpperCase())&&axe.commons.dom.hasContentVirtual(c)){var d=window.getComputedStyle(a);if(\"none\"===d.getPropertyValue(\"display\"))return;if(\"hidden\"===d.getPropertyValue(\"visibility\")){var e=axe.commons.dom.getComposedParent(a),f=e&&window.getComputedStyle(e);if(!f||\"hidden\"!==f.getPropertyValue(\"visibility\"))return}}return!0}}],commons:function(){function a(a){return a.getPropertyValue(\"font-family\").split(/[,;]/g).map(function(a){return a.trim().toLowerCase()})}function b(b,c){var d=window.getComputedStyle(b);if(\"none\"!==d.getPropertyValue(\"background-image\"))return!0;if([\"border-bottom\",\"border-top\",\"outline\"].reduce(function(a,b){var c=new C.Color;return c.parseRgbString(d.getPropertyValue(b+\"-color\")),a||\"none\"!==d.getPropertyValue(b+\"-style\")&&parseFloat(d.getPropertyValue(b+\"-width\"))>0&&0!==c.alpha},!1))return!0;var e=window.getComputedStyle(c);if(a(d)[0]!==a(e)[0])return!0;var f=[\"text-decoration-line\",\"text-decoration-style\",\"font-weight\",\"font-style\",\"font-size\"].reduce(function(a,b){return a||d.getPropertyValue(b)!==e.getPropertyValue(b)},!1),g=d.getPropertyValue(\"text-decoration\");return g.split(\" \").length<3&&(f=f||g!==e.getPropertyValue(\"text-decoration\")),f}function c(a,b){var c=a.nodeName.toUpperCase();if(G.includes(c))return axe.commons.color.incompleteData.set(\"bgColor\",\"imgNode\"),!0;b=b||window.getComputedStyle(a);var d=b.getPropertyValue(\"background-image\"),e=\"none\"!==d;if(e){var f=/gradient/.test(d);axe.commons.color.incompleteData.set(\"bgColor\",f?\"bgGradient\":\"bgImage\")}return e}function d(a,b){b=b||window.getComputedStyle(a);var c=new C.Color;if(c.parseRgbString(b.getPropertyValue(\"background-color\")),0!==c.alpha){var d=b.getPropertyValue(\"opacity\");c.alpha=c.alpha*d}return c}function e(a,b){var c=a.getClientRects()[0],d=D.shadowElementsFromPoint(c.left,c.top);if(d)for(var e=0;e<d.length;e++)if(d[e]!==a&&d[e]===b)return!0;return!1}function f(a,b,c){var f=0;if(a>0)for(var g=a-1;g>=0;g--){var h=b[g],i=window.getComputedStyle(h),j=d(h,i);j.alpha&&e(c,h)?f+=j.alpha:b.splice(g,1)}return f}function g(a,b,c){var d=a!==b&&!D.visuallyContains(a,b)&&0!==c.alpha;return d&&axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscured\"),d}function h(a,b){var c={TD:[\"TR\",\"TBODY\"],TH:[\"TR\",\"THEAD\"],INPUT:[\"LABEL\"]},d=a.map(function(a){return a.tagName}),e=a;for(var f in c)if(d.includes(f))for(var g in c[f])if(f.hasOwnProperty(g)){var h=axe.commons.dom.findUp(b,c[f][g]);if(h&&-1===a.indexOf(h)){var i=axe.commons.dom.visuallyOverlaps(b.getBoundingClientRect(),h);i&&e.splice(d.indexOf(f)+1,0,h)}b.tagName===c[f][g]&&-1===d.indexOf(b.tagName)&&e.splice(d.indexOf(f)+1,0,b)}return e}function i(a){var b=a.indexOf(document.body),e=a;return b>1&&!c(document.documentElement)&&0===d(document.documentElement).alpha&&(e.splice(b,1),e.splice(a.indexOf(document.documentElement),1),e.push(document.body)),e}function j(a){if(!H.includes(a.actualNode.nodeName.toUpperCase()))return a.children.some(function(a){var b=a.actualNode;return 3===b.nodeType&&b.nodeValue.trim()})}function k(a){return a.disabled||!D.isVisible(a,!0)&&\"AREA\"!==a.nodeName.toUpperCase()}function l(a,b){!1!==b(a.actualNode)&&a.children.forEach(function(a){return l(a,b)})}function m(a){var b=window.getComputedStyle(a).getPropertyValue(\"display\");return I.includes(b)||\"table-\"===b.substr(0,6)}function n(a){for(var b=D.getComposedParent(a);b&&!m(b);)b=D.getComposedParent(b);return axe.utils.getNodeFromTree(axe._tree[0],b)}function o(a,b){for(a=D.getComposedParent(a);a&&\"html\"!==a.nodeName.toLowerCase();){if(a.scrollTop&&(b+=a.scrollTop)>=0)return!1;a=D.getComposedParent(a)}return!0}function p(a){\"use strict\";var b=a.match(/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px\\s*\\)/);return!(!b||5!==b.length)&&(b[3]-b[1]<=0&&b[2]-b[4]<=0)}function q(a){var b=void 0;return b=a.actualNode.id?D.findElmsInContext({elm:\"label\",attr:\"for\",value:a.actualNode.id,context:a.actualNode})[0]:D.findUpVirtual(a,\"label\"),axe.utils.getNodeFromTree(axe._tree[0],b)}function r(a){return[\"button\",\"reset\",\"submit\"].includes(a.actualNode.type.toLowerCase())}function s(a){var b=a.actualNode,c=b.nodeName.toUpperCase();return\"TEXTAREA\"===c||\"SELECT\"===c||\"INPUT\"===c&&\"hidden\"!==b.type.toLowerCase()}function t(a){return[\"BUTTON\",\"SUMMARY\",\"A\"].includes(a.actualNode.nodeName.toUpperCase())}function u(a){return[\"TABLE\",\"FIGURE\"].includes(a.actualNode.nodeName.toUpperCase())}function v(a){var b=a.actualNode,c=b.nodeName.toUpperCase();if(\"INPUT\"===c)return!b.hasAttribute(\"type\")||L.includes(b.type.toLowerCase())?b.value:\"\";if(\"SELECT\"===c){var d=b.options;if(d&&d.length){for(var e=\"\",f=0;f<d.length;f++)d[f].selected&&(e+=\" \"+d[f].text);return F.sanitize(e)}return\"\"}return\"TEXTAREA\"===c&&b.value?b.value:\"\"}function w(a,b){var c=a.actualNode,d=c.querySelector(b.toLowerCase());return d?F.accessibleText(d):\"\"}function x(a){if(!a)return!1;var b=a.actualNode;switch(b.nodeName.toUpperCase()){case\"SELECT\":case\"TEXTAREA\":return!0;case\"INPUT\":return!b.hasAttribute(\"type\")||L.includes(b.getAttribute(\"type\").toLowerCase());default:return!1}}function y(a){var b=a.actualNode,c=b.nodeName.toUpperCase();return[\"IMG\",\"APPLET\",\"AREA\"].includes(c)||\"INPUT\"===c&&\"image\"===b.type.toLowerCase()}function z(a){return!!F.sanitize(a)}var commons={},A=commons.aria={},B=A.lookupTable={};B.attributes={\"aria-activedescendant\":{type:\"idref\"},\"aria-atomic\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-autocomplete\":{type:\"nmtoken\",values:[\"inline\",\"list\",\"both\",\"none\"]},\"aria-busy\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-checked\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"]},\"aria-colcount\":{type:\"int\"},\"aria-colindex\":{type:\"int\"},\"aria-colspan\":{type:\"int\"},\"aria-controls\":{type:\"idrefs\"},\"aria-current\":{type:\"nmtoken\",values:[\"page\",\"step\",\"location\",\"date\",\"time\",\"true\",\"false\"]},\"aria-describedby\":{type:\"idrefs\"},\"aria-disabled\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-dropeffect\":{type:\"nmtokens\",values:[\"copy\",\"move\",\"reference\",\"execute\",\"popup\",\"none\"]},\"aria-errormessage\":{type:\"idref\"},\"aria-expanded\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"]},\"aria-flowto\":{type:\"idrefs\"},\"aria-grabbed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"]},\"aria-haspopup\":{type:\"nmtoken\",values:[\"true\",\"false\",\"menu\",\"listbox\",\"tree\",\"grid\",\"dialog\"]},\"aria-hidden\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-invalid\":{type:\"nmtoken\",values:[\"true\",\"false\",\"spelling\",\"grammar\"]},\"aria-keyshortcuts\":{type:\"string\"},\"aria-label\":{type:\"string\"},\"aria-labelledby\":{type:\"idrefs\"},\"aria-level\":{type:\"int\"},\"aria-live\":{type:\"nmtoken\",values:[\"off\",\"polite\",\"assertive\"]},\"aria-modal\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-multiline\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-multiselectable\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-orientation\":{type:\"nmtoken\",values:[\"horizontal\",\"vertical\"]},\"aria-owns\":{type:\"idrefs\"},\"aria-placeholder\":{type:\"string\"},\"aria-posinset\":{type:\"int\"},\"aria-pressed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"]},\"aria-readonly\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-relevant\":{type:\"nmtokens\",values:[\"additions\",\"removals\",\"text\",\"all\"]},\"aria-required\":{type:\"boolean\",values:[\"true\",\"false\"]},\"aria-rowcount\":{type:\"int\"},\"aria-rowindex\":{type:\"int\"},\"aria-rowspan\":{type:\"int\"},\"aria-selected\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"]},\"aria-setsize\":{type:\"int\"},\"aria-sort\":{type:\"nmtoken\",values:[\"ascending\",\"descending\",\"other\",\"none\"]},\"aria-valuemax\":{type:\"decimal\"},\"aria-valuemin\":{type:\"decimal\"},\"aria-valuenow\":{type:\"decimal\"},\"aria-valuetext\":{type:\"string\"}},B.globalAttributes=[\"aria-atomic\",\"aria-busy\",\"aria-controls\",\"aria-current\",\"aria-describedby\",\"aria-disabled\",\"aria-dropeffect\",\"aria-flowto\",\"aria-grabbed\",\"aria-haspopup\",\"aria-hidden\",\"aria-invalid\",\"aria-keyshortcuts\",\"aria-label\",\"aria-labelledby\",\"aria-live\",\"aria-owns\",\"aria-relevant\"],B.role={alert:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},alertdialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\"]},owned:null,nameFrom:[\"author\"],context:null},application:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},article:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-posinset\",\"aria-setsize\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"article\"]},banner:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"header\"]},button:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-pressed\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"button\",'input[type=\"button\"]','input[type=\"image\"]','input[type=\"reset\"]','input[type=\"submit\"]',\"summary\"]},cell:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-rowindex\",\"aria-rowspan\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"]},checkbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-required\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"checkbox\"]']},columnheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"]},combobox:{type:\"composite\",attributes:{allowed:[\"aria-expanded\",\"aria-autocomplete\",\"aria-required\",\"aria-activedescendant\",\"aria-orientation\"]},owned:{all:[\"listbox\",\"textbox\"]},nameFrom:[\"author\"],context:null},command:{nameFrom:[\"author\"],type:\"abstract\"},complementary:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"aside\"]},composite:{nameFrom:[\"author\"],type:\"abstract\"},contentinfo:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"footer\"]},definition:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dd\",\"dfn\"]},dialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dialog\"]},directory:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null},document:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"body\"]},feed:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:{one:[\"article\"]},nameFrom:[\"author\"],context:null},form:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"form\"]},grid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-colcount\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-rowcount\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"]},gridcell:{type:\"widget\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-selected\",\"aria-readonly\",\"aria-required\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"]},group:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"details\",\"optgroup\"]},heading:{type:\"structure\",attributes:{allowed:[\"aria-level\",\"aria-expanded\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"]},img:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"img\"]},input:{nameFrom:[\"author\"],type:\"abstract\"},landmark:{nameFrom:[\"author\"],type:\"abstract\"},link:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"a[href]\"]},list:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:{all:[\"listitem\"]},nameFrom:[\"author\"],context:null,implicit:[\"ol\",\"ul\",\"dl\"]},listbox:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\"]},owned:{all:[\"option\"]},nameFrom:[\"author\"],context:null,implicit:[\"select\"]},listitem:{type:\"structure\",attributes:{allowed:[\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-expanded\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"list\"],implicit:[\"li\",\"dt\"]},log:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},main:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"main\"]},marquee:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},math:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"math\"]},menu:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,implicit:['menu[type=\"context\"]']},menubar:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\"]},owned:null,nameFrom:[\"author\"],context:null},menuitem:{type:\"widget\",attributes:{allowed:[\"aria-posinset\",\"aria-setsize\",\"aria-expanded\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"command\"]']},menuitemcheckbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-posinset\",\"aria-setsize\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"checkbox\"]']},menuitemradio:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-posinset\",\"aria-setsize\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"radio\"]']},navigation:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"nav\"]},none:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null},note:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},option:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"listbox\"],implicit:[\"option\"]},presentation:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null},progressbar:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"progress\"]},radio:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-required\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"radio\"]']},radiogroup:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-required\",\"aria-expanded\"]},owned:{all:[\"radio\"]},nameFrom:[\"author\"],context:null},range:{nameFrom:[\"author\"],type:\"abstract\"},region:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"section[aria-label]\",\"section[aria-labelledby]\",\"section[title]\"]},roletype:{type:\"abstract\"},row:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colindex\",\"aria-expanded\",\"aria-level\",\"aria-selected\",\"aria-rowindex\"]},owned:{one:[\"cell\",\"columnheader\",\"rowheader\",\"gridcell\"]},nameFrom:[\"author\",\"contents\"],context:[\"rowgroup\",\"grid\",\"treegrid\",\"table\"],implicit:[\"tr\"]},rowgroup:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\"]},owned:{all:[\"row\"]},nameFrom:[\"author\",\"contents\"],context:[\"grid\",\"table\"],implicit:[\"tbody\",\"thead\",\"tfoot\"]},rowheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"]},scrollbar:{type:\"widget\",attributes:{required:[\"aria-controls\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"],allowed:[\"aria-valuetext\",\"aria-orientation\"]},owned:null,nameFrom:[\"author\"],context:null},search:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},searchbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"search\"]']},section:{nameFrom:[\"author\",\"contents\"],type:\"abstract\"},sectionhead:{nameFrom:[\"author\",\"contents\"],type:\"abstract\"},select:{nameFrom:[\"author\"],type:\"abstract\"},separator:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-orientation\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"hr\"]},slider:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-orientation\"],required:[\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"range\"]']},spinbutton:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-required\"],required:[\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"number\"]']},status:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"output\"]},structure:{type:\"abstract\"},switch:{type:\"widget\",attributes:{required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null},tab:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-expanded\",\"aria-setsize\",\"aria-posinset\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"tablist\"]},table:{type:\"structure\",attributes:{allowed:[\"aria-colcount\",\"aria-rowcount\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"]},tablist:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-orientation\"]},owned:{all:[\"tab\"]},nameFrom:[\"author\"],context:null},tabpanel:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},term:{type:\"structure\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"dt\"]},text:{type:\"structure\",owned:null,nameFrom:[\"author\",\"contents\"],context:null},textbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"text\"]','input[type=\"email\"]','input[type=\"password\"]','input[type=\"tel\"]','input[type=\"url\"]',\"input:not([type])\",\"textarea\"]},timer:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null},toolbar:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['menu[type=\"toolbar\"]']},tooltip:{type:\"widget\",attributes:{allowed:[\"aria-expanded\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null},tree:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\"]},owned:{all:[\"treeitem\"]},nameFrom:[\"author\"],context:null},treegrid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colcount\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-required\",\"aria-rowcount\",\"aria-orientation\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null},treeitem:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"group\",\"tree\"]},widget:{type:\"abstract\"},window:{nameFrom:[\"author\"],type:\"abstract\"}};var C={};commons.color=C;var D=commons.dom={},E=commons.table={},F=commons.text={EdgeFormDefaults:{}};commons.utils=axe.utils;A.requiredAttr=function(a){\"use strict\";var b=A.lookupTable.role[a];return b&&b.attributes&&b.attributes.required||[]},A.allowedAttr=function(a){\"use strict\";var b=A.lookupTable.role[a],c=b&&b.attributes&&b.attributes.allowed||[],d=b&&b.attributes&&b.attributes.required||[];return c.concat(A.lookupTable.globalAttributes).concat(d)},A.validateAttr=function(a){\"use strict\";return!!A.lookupTable.attributes[a]},A.validateAttrValue=function(a,b){\"use strict\";var c,d,e=a.getAttribute(b),f=A.lookupTable.attributes[b],g=D.getRootNode(a);if(!f)return!0;switch(f.type){case\"boolean\":case\"nmtoken\":return\"string\"==typeof e&&-1!==f.values.indexOf(e.toLowerCase());case\"nmtokens\":return d=axe.utils.tokenList(e),d.reduce(function(a,b){return a&&-1!==f.values.indexOf(b)},0!==d.length);case\"idref\":return!(!e||!g.getElementById(e));case\"idrefs\":return d=axe.utils.tokenList(e),d.reduce(function(a,b){return!(!a||!g.getElementById(b))},0!==d.length);case\"string\":return!0;case\"decimal\":return!(!(c=e.match(/^[-+]?([0-9]*)\\.?([0-9]*)$/))||!c[1]&&!c[2]);case\"int\":return/^[-+]?[0-9]+$/.test(e)}},A.labelVirtual=function(a){var b=a.actualNode,c=void 0,d=void 0;return b.getAttribute(\"aria-labelledby\")&&(c=D.idrefs(b,\"aria-labelledby\"),d=c.map(function(a){\nvar b=axe.utils.getNodeFromTree(axe._tree[0],a);return b?F.visibleVirtual(b,!0):\"\"}).join(\" \").trim())?d:(d=b.getAttribute(\"aria-label\"),d&&(d=F.sanitize(d).trim())?d:null)},A.label=function(a){return a=axe.utils.getNodeFromTree(axe._tree[0],a),A.labelVirtual(a)},A.isValidRole=function(a){\"use strict\";return!!A.lookupTable.role[a]},A.getRolesWithNameFromContents=function(){return Object.keys(A.lookupTable.role).filter(function(a){return A.lookupTable.role[a].nameFrom&&-1!==A.lookupTable.role[a].nameFrom.indexOf(\"contents\")})},A.getRolesByType=function(a){return Object.keys(A.lookupTable.role).filter(function(b){return A.lookupTable.role[b].type===a})},A.getRoleType=function(a){var b=A.lookupTable.role[a];return b&&b.type||null},A.requiredOwned=function(a){\"use strict\";var b=null,c=A.lookupTable.role[a];return c&&(b=axe.utils.clone(c.owned)),b},A.requiredContext=function(a){\"use strict\";var b=null,c=A.lookupTable.role[a];return c&&(b=axe.utils.clone(c.context)),b},A.implicitNodes=function(a){\"use strict\";var b=null,c=A.lookupTable.role[a];return c&&c.implicit&&(b=axe.utils.clone(c.implicit)),b},A.implicitRole=function(a){\"use strict\";var b=function(b,c){var d=function(b){return axe.utils.matchesSelector(a,b)};return c.implicit&&c.implicit.some(d)&&b.push(c.name),b},c=Object.keys(A.lookupTable.role).map(function(a){var b=A.lookupTable.role[a];return{name:a,implicit:b&&b.implicit}}),d=c.reduce(b,[]);if(!d.length)return null;for(var e=a.attributes,f=[],g=0,h=e.length;g<h;g++){var i=e[g];i.name.match(/^aria-/)&&f.push(i.name)}return function(a,b){var c=function(a){return A.allowedAttr(a).reduce(function(a,c){return a+(b.indexOf(c)>-1?1:0)},0)};return a.map(function(a){return{score:c(a),name:a}}).sort(function(a,b){return b.score-a.score}).map(function(a){return a.name})}(d,f).shift()},C.Color=function(a,b,c,d){this.red=a,this.green=b,this.blue=c,this.alpha=d,this.toHexString=function(){var a=Math.round(this.red).toString(16),b=Math.round(this.green).toString(16),c=Math.round(this.blue).toString(16);return\"#\"+(this.red>15.5?a:\"0\"+a)+(this.green>15.5?b:\"0\"+b)+(this.blue>15.5?c:\"0\"+c)};var e=/^rgb\\((\\d+), (\\d+), (\\d+)\\)$/,f=/^rgba\\((\\d+), (\\d+), (\\d+), (\\d*(\\.\\d+)?)\\)/;this.parseRgbString=function(a){if(\"transparent\"===a)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var b=a.match(e);return b?(this.red=parseInt(b[1],10),this.green=parseInt(b[2],10),this.blue=parseInt(b[3],10),void(this.alpha=1)):(b=a.match(f),b?(this.red=parseInt(b[1],10),this.green=parseInt(b[2],10),this.blue=parseInt(b[3],10),void(this.alpha=parseFloat(b[4]))):void 0)},this.getRelativeLuminance=function(){var a=this.red/255,b=this.green/255,c=this.blue/255;return.2126*(a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4))+.7152*(b<=.03928?b/12.92:Math.pow((b+.055)/1.055,2.4))+.0722*(c<=.03928?c/12.92:Math.pow((c+.055)/1.055,2.4))}},C.flattenColors=function(a,b){var c=a.alpha,d=(1-c)*b.red+c*a.red,e=(1-c)*b.green+c*a.green,f=(1-c)*b.blue+c*a.blue,g=a.alpha+b.alpha*(1-a.alpha);return new C.Color(d,e,f,g)},C.getContrast=function(a,b){if(!b||!a)return null;b.alpha<1&&(b=C.flattenColors(b,a));var c=a.getRelativeLuminance(),d=b.getRelativeLuminance();return(Math.max(d,c)+.05)/(Math.min(d,c)+.05)},C.hasValidContrastRatio=function(a,b,c,d){var e=C.getContrast(a,b),f=d&&Math.ceil(72*c)/96<14||!d&&Math.ceil(72*c)/96<18,g=f?4.5:3;return{isValid:e>g,contrastRatio:e,expectedContrastRatio:g}},C.elementIsDistinct=b;var G=[\"IMG\",\"CANVAS\",\"OBJECT\",\"IFRAME\",\"VIDEO\",\"SVG\"];C.getCoords=function(a){var b=void 0,c=void 0;if(!(a.left>window.innerWidth||a.top>window.innerHeight))return b=Math.min(Math.ceil(a.left+a.width/2),window.innerWidth-1),c=Math.min(Math.ceil(a.top+a.height/2),window.innerHeight-1),{x:b,y:c}},C.getRectStack=function(a){var b=C.getCoords(a.getBoundingClientRect());if(b){var c=D.shadowElementsFromPoint(b.x,b.y),d=Array.from(a.getClientRects());if(d&&d.length>1){var e=d.filter(function(a){return a.width&&a.width>0}).map(function(a){var b=C.getCoords(a);if(b)return D.shadowElementsFromPoint(b.x,b.y)});return e.splice(0,0,c),e}return[c]}return null},C.filteredRectStack=function(a){var b=C.getRectStack(a);if(b&&1===b.length)return b[0];if(b&&b.length>1){var c=b.shift(),d=void 0;return b.forEach(function(e,f){if(0!==f){var g=b[f-1],h=b[f];d=g.every(function(a,b){return a===h[b]})||c.includes(a)}}),d?b[0]:(axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscuring\"),null)}return axe.commons.color.incompleteData.set(\"bgColor\",\"outsideViewport\"),null},C.getBackgroundStack=function(a){var b=C.filteredRectStack(a);if(null===b)return null;b=h(b,a),b=D.reduceToElementsBelowFloating(b,a),b=i(b);var c=b.indexOf(a);return f(c,b,a)>=.99?(axe.commons.color.incompleteData.set(\"bgColor\",\"bgOverlap\"),null):-1!==c?b:null},C.getBackgroundColor=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!0!==(arguments.length>2&&void 0!==arguments[2]&&arguments[2])){var e=a.clientHeight-2>=2*window.innerHeight;a.scrollIntoView(e)}var f=[],h=C.getBackgroundStack(a);if((h||[]).some(function(e){var h=window.getComputedStyle(e),i=d(e,h);return g(a,e,i)||c(e,h)?(f=null,b.push(e),!0):0!==i.alpha&&(b.push(e),f.push(i),1===i.alpha)}),null!==f&&null!==h){f.push(new C.Color(255,255,255,1));return f.reduce(C.flattenColors)}return null},D.isOpaque=function(a){var b=window.getComputedStyle(a);return c(a,b)||1===d(a,b).alpha},C.getForegroundColor=function(a,b){var c=window.getComputedStyle(a),d=new C.Color;d.parseRgbString(c.getPropertyValue(\"color\"));var e=c.getPropertyValue(\"opacity\");if(d.alpha=d.alpha*e,1===d.alpha)return d;var f=C.getBackgroundColor(a,[],b);if(null===f){var g=axe.commons.color.incompleteData.get(\"bgColor\");return axe.commons.color.incompleteData.set(\"fgColor\",g),null}return C.flattenColors(d,f)},C.incompleteData=function(){var a={};return{set:function(b,c){if(\"string\"!=typeof b)throw new Error(\"Incomplete data: key must be a string\");return c&&(a[b]=c),a[b]},get:function(b){return a[b]},clear:function(){a={}}}}(),D.reduceToElementsBelowFloating=function(a,b){var c,d,e,f=[\"fixed\",\"sticky\"],g=[],h=!1;for(c=0;c<a.length;++c)d=a[c],d===b&&(h=!0),e=window.getComputedStyle(d),h||-1===f.indexOf(e.position)?g.push(d):g=[];return g},D.findElmsInContext=function(a){var b=a.context,c=a.value,d=a.attr,e=a.elm,f=void 0===e?\"\":e,g=void 0,h=axe.utils.escapeSelector(c);return g=9===b.nodeType||11===b.nodeType?b:D.getRootNode(b),Array.from(g.querySelectorAll(f+\"[\"+d+\"=\"+h+\"]\"))},D.findUp=function(a,b){return D.findUpVirtual(axe.utils.getNodeFromTree(axe._tree[0],a),b)},D.findUpVirtual=function(a,b){var c=void 0;if(c=a.actualNode,!a.shadowId&&\"function\"==typeof a.actualNode.closest){var d=a.actualNode.closest(b);return d||null}do{(c=c.assignedSlot?c.assignedSlot:c.parentNode)&&11===c.nodeType&&(c=c.host)}while(c&&!axe.utils.matchesSelector(c,b)&&c!==document.documentElement);return axe.utils.matchesSelector(c,b)?c:null},D.getComposedParent=function a(b){if(b.assignedSlot)return a(b.assignedSlot);if(b.parentNode){var c=b.parentNode;if(1===c.nodeType)return c;if(c.host)return c.host}return null},D.getElementByReference=function(a,b){var c=a.getAttribute(b);if(c&&\"#\"===c.charAt(0)){c=c.substring(1);var d=document.getElementById(c);if(d)return d;if(d=document.getElementsByName(c),d.length)return d[0]}return null},D.getElementCoordinates=function(a){\"use strict\";var b=D.getScrollOffset(document),c=b.left,d=b.top,e=a.getBoundingClientRect();return{top:e.top+d,right:e.right+c,bottom:e.bottom+d,left:e.left+c,width:e.right-e.left,height:e.bottom-e.top}},D.getRootNode=function(a){var b=a.getRootNode&&a.getRootNode()||document;return b===a&&(b=document),b},D.getScrollOffset=function(a){\"use strict\";if(!a.nodeType&&a.document&&(a=a.document),9===a.nodeType){var b=a.documentElement,c=a.body;return{left:b&&b.scrollLeft||c&&c.scrollLeft||0,top:b&&b.scrollTop||c&&c.scrollTop||0}}return{left:a.scrollLeft,top:a.scrollTop}},D.getViewportSize=function(a){\"use strict\";var b,c=a.document,d=c.documentElement;return a.innerWidth?{width:a.innerWidth,height:a.innerHeight}:d?{width:d.clientWidth,height:d.clientHeight}:(b=c.body,{width:b.clientWidth,height:b.clientHeight})};var H=[\"HEAD\",\"TITLE\",\"TEMPLATE\",\"SCRIPT\",\"STYLE\",\"IFRAME\",\"OBJECT\",\"VIDEO\",\"AUDIO\",\"NOSCRIPT\"];D.hasContentVirtual=function(a,b){return j(a)||D.isVisualContent(a.actualNode)||!!A.labelVirtual(a)||!b&&a.children.some(function(a){return 1===a.actualNode.nodeType&&D.hasContentVirtual(a)})},D.hasContent=function(a,b){return a=axe.utils.getNodeFromTree(axe._tree[0],a),D.hasContentVirtual(a,b)},D.idrefs=function(a,b){\"use strict\";var c,d,e=D.getRootNode(a),f=[],g=a.getAttribute(b);if(g)for(g=axe.utils.tokenList(g),c=0,d=g.length;c<d;c++)f.push(e.getElementById(g[c]));return f},D.isFocusable=function(a){\"use strict\";if(k(a))return!1;if(D.isNativelyFocusable(a))return!0;var b=a.getAttribute(\"tabindex\");return!(!b||isNaN(parseInt(b,10)))},D.isNativelyFocusable=function(a){\"use strict\";if(!a||k(a))return!1;switch(a.nodeName.toUpperCase()){case\"A\":case\"AREA\":if(a.href)return!0;break;case\"INPUT\":return\"hidden\"!==a.type;case\"TEXTAREA\":case\"SELECT\":case\"DETAILS\":case\"BUTTON\":return!0}return!1},D.insertedIntoFocusOrder=function(a){return a.tabIndex>-1&&D.isFocusable(a)&&!D.isNativelyFocusable(a)},D.isHTML5=function(a){var b=a.doctype;return null!==b&&(\"html\"===b.name&&!b.publicId&&!b.systemId)};var I=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];D.isInTextBlock=function(a){if(m(a))return!1;var b=n(a),c=\"\",d=\"\",e=0;return l(b,function(b){if(2===e)return!1;if(3===b.nodeType&&(c+=b.nodeValue),1===b.nodeType){var f=(b.nodeName||\"\").toUpperCase();if([\"BR\",\"HR\"].includes(f))0===e?(c=\"\",d=\"\"):e=2;else{if(\"none\"===b.style.display||\"hidden\"===b.style.overflow||![\"\",null,\"none\"].includes(b.style.float)||![\"\",null,\"relative\"].includes(b.style.position))return!1;if(\"A\"===f&&b.href||\"link\"===(b.getAttribute(\"role\")||\"\").toLowerCase())return b===a&&(e=1),d+=b.textContent,!1}}}),c=axe.commons.text.sanitize(c),d=axe.commons.text.sanitize(d),c.length>d.length},D.isNode=function(a){\"use strict\";return a instanceof Node},D.isOffscreen=function(a){var b=void 0,c=document.documentElement,d=window.getComputedStyle(a),e=window.getComputedStyle(document.body||c).getPropertyValue(\"direction\"),f=D.getElementCoordinates(a);if(f.bottom<0&&(o(a,f.bottom)||\"absolute\"===d.position))return!0;if(0===f.left&&0===f.right)return!1;if(\"ltr\"===e){if(f.right<=0)return!0}else if(b=Math.max(c.scrollWidth,D.getViewportSize(window).width),f.left>=b)return!0;return!1},D.isVisible=function(a,b,c){\"use strict\";var d,e,f;return 9===a.nodeType||(11===a.nodeType&&(a=a.host),null!==(d=window.getComputedStyle(a,null))&&(e=a.nodeName.toUpperCase(),!(\"none\"===d.getPropertyValue(\"display\")||\"STYLE\"===e.toUpperCase()||\"SCRIPT\"===e.toUpperCase()||!b&&p(d.getPropertyValue(\"clip\"))||!c&&(\"hidden\"===d.getPropertyValue(\"visibility\")||!b&&D.isOffscreen(a))||b&&\"true\"===a.getAttribute(\"aria-hidden\"))&&(!!(f=a.assignedSlot?a.assignedSlot:a.parentNode)&&D.isVisible(f,b,!0))))};var J=[\"checkbox\",\"img\",\"radio\",\"range\",\"slider\",\"spinbutton\",\"textbox\"];D.isVisualContent=function(a){var b=a.getAttribute(\"role\");if(b)return-1!==J.indexOf(b);switch(a.tagName.toUpperCase()){case\"IMG\":case\"IFRAME\":case\"OBJECT\":case\"VIDEO\":case\"AUDIO\":case\"CANVAS\":case\"SVG\":case\"MATH\":case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":case\"KEYGEN\":case\"PROGRESS\":case\"METER\":return!0;case\"INPUT\":return\"hidden\"!==a.type;default:return!1}},D.shadowElementsFromPoint=function(a,b){return(arguments.length>2&&void 0!==arguments[2]?arguments[2]:document).elementsFromPoint(a,b).reduce(function(c,d){if(axe.utils.isShadowRoot(d)){var e=D.shadowElementsFromPoint(a,b,d.shadowRoot);c=c.concat(e),c.length&&axe.commons.dom.visuallyContains(c[0],d)&&c.push(d)}else c.push(d);return c},[])},D.visuallyContains=function(a,b){var c=a.getBoundingClientRect(),d={top:c.top+.01,bottom:c.bottom-.01,left:c.left+.01,right:c.right-.01},e=b.getBoundingClientRect(),f=e.top,g=e.left,h={top:f-b.scrollTop,bottom:f-b.scrollTop+b.scrollHeight,left:g-b.scrollLeft,right:g-b.scrollLeft+b.scrollWidth},i=window.getComputedStyle(b);return\"inline\"===i.getPropertyValue(\"display\")||!(d.left<h.left&&d.left<e.left||d.top<h.top&&d.top<e.top||d.right>h.right&&d.right>e.right||d.bottom>h.bottom&&d.bottom>e.bottom)&&(!(d.right>e.right||d.bottom>e.bottom)||(\"scroll\"===i.overflow||\"auto\"===i.overflow||\"hidden\"===i.overflow||b instanceof HTMLBodyElement||b instanceof HTMLHtmlElement))},D.visuallyOverlaps=function(a,b){var c=b.getBoundingClientRect(),d=c.top,e=c.left,f={top:d-b.scrollTop,bottom:d-b.scrollTop+b.scrollHeight,left:e-b.scrollLeft,right:e-b.scrollLeft+b.scrollWidth};if(a.left>f.right&&a.left>c.right||a.top>f.bottom&&a.top>c.bottom||a.right<f.left&&a.right<c.left||a.bottom<f.top&&a.bottom<c.top)return!1;var g=window.getComputedStyle(b);return!(a.left>c.right||a.top>c.bottom)||(\"scroll\"===g.overflow||\"auto\"===g.overflow||b instanceof HTMLBodyElement||b instanceof HTMLHtmlElement)},E.getAllCells=function(a){var b,c,d,e,f=[];for(b=0,d=a.rows.length;b<d;b++)for(c=0,e=a.rows[b].cells.length;c<e;c++)f.push(a.rows[b].cells[c]);return f},E.getCellPosition=function(a,b){var c,d;for(b||(b=E.toGrid(D.findUp(a,\"table\"))),c=0;c<b.length;c++)if(b[c]&&-1!==(d=b[c].indexOf(a)))return{x:d,y:c}},E.getHeaders=function(a){if(a.hasAttribute(\"headers\"))return commons.dom.idrefs(a,\"headers\");var b=commons.table.toGrid(commons.dom.findUp(a,\"table\")),c=commons.table.getCellPosition(a,b);return[].concat(E.traverse(\"left\",c,b).filter(function(a){return E.isRowHeader(a)}),E.traverse(\"up\",c,b).filter(function(a){return E.isColumnHeader(a)})).reverse()},E.getScope=function(a){var b=a.getAttribute(\"scope\"),c=a.getAttribute(\"role\");if(a instanceof Element==!1||-1===[\"TD\",\"TH\"].indexOf(a.nodeName.toUpperCase()))throw new TypeError(\"Expected TD or TH element\");if(\"columnheader\"===c)return\"col\";if(\"rowheader\"===c)return\"row\";if(\"col\"===b||\"row\"===b)return b;if(\"TH\"!==a.nodeName.toUpperCase())return!1;var d=E.toGrid(D.findUp(a,\"table\")),e=E.getCellPosition(a);return d[e.y].reduce(function(a,b){return a&&\"TH\"===b.nodeName.toUpperCase()},!0)?\"col\":d.map(function(a){return a[e.x]}).reduce(function(a,b){return a&&\"TH\"===b.nodeName.toUpperCase()},!0)?\"row\":\"auto\"},E.isColumnHeader=function(a){return-1!==[\"col\",\"auto\"].indexOf(E.getScope(a))},E.isDataCell=function(a){return!(!a.children.length&&!a.textContent.trim())&&\"TD\"===a.nodeName.toUpperCase()},E.isDataTable=function(a){var b=(a.getAttribute(\"role\")||\"\").toLowerCase();if((\"presentation\"===b||\"none\"===b)&&!D.isFocusable(a))return!1;if(\"true\"===a.getAttribute(\"contenteditable\")||D.findUp(a,'[contenteditable=\"true\"]'))return!0;if(\"grid\"===b||\"treegrid\"===b||\"table\"===b)return!0;if(\"landmark\"===commons.aria.getRoleType(b))return!0;if(\"0\"===a.getAttribute(\"datatable\"))return!1;if(a.getAttribute(\"summary\"))return!0;if(a.tHead||a.tFoot||a.caption)return!0;for(var c=0,d=a.children.length;c<d;c++)if(\"COLGROUP\"===a.children[c].nodeName.toUpperCase())return!0;for(var e,f,g=0,h=a.rows.length,i=!1,j=0;j<h;j++){e=a.rows[j];for(var k=0,l=e.cells.length;k<l;k++){if(f=e.cells[k],\"TH\"===f.nodeName.toUpperCase())return!0;if(i||f.offsetWidth===f.clientWidth&&f.offsetHeight===f.clientHeight||(i=!0),f.getAttribute(\"scope\")||f.getAttribute(\"headers\")||f.getAttribute(\"abbr\"))return!0;if([\"columnheader\",\"rowheader\"].includes((f.getAttribute(\"role\")||\"\").toLowerCase()))return!0;if(1===f.children.length&&\"ABBR\"===f.children[0].nodeName.toUpperCase())return!0;g++}}if(a.getElementsByTagName(\"table\").length)return!1;if(h<2)return!1;var m=a.rows[Math.ceil(h/2)];if(1===m.cells.length&&1===m.cells[0].colSpan)return!1;if(m.cells.length>=5)return!0;if(i)return!0;var n,o;for(j=0;j<h;j++){if(e=a.rows[j],n&&n!==window.getComputedStyle(e).getPropertyValue(\"background-color\"))return!0;if(n=window.getComputedStyle(e).getPropertyValue(\"background-color\"),o&&o!==window.getComputedStyle(e).getPropertyValue(\"background-image\"))return!0;o=window.getComputedStyle(e).getPropertyValue(\"background-image\")}return h>=20||!(D.getElementCoordinates(a).width>.95*D.getViewportSize(window).width)&&(!(g<10)&&!a.querySelector(\"object, embed, iframe, applet\"))},E.isHeader=function(a){if(E.isColumnHeader(a)||E.isRowHeader(a))return!0;if(a.getAttribute(\"id\")){var b=axe.utils.escapeSelector(a.getAttribute(\"id\"));return!!document.querySelector('[headers~=\"'+b+'\"]')}return!1},E.isRowHeader=function(a){return[\"row\",\"auto\"].includes(E.getScope(a))},E.toGrid=function(a){for(var b=[],c=a.rows,d=0,e=c.length;d<e;d++){var f=c[d].cells;b[d]=b[d]||[];for(var g=0,h=0,i=f.length;h<i;h++)for(var j=0;j<f[h].colSpan;j++){for(var k=0;k<f[h].rowSpan;k++){for(b[d+k]=b[d+k]||[];b[d+k][g];)g++;b[d+k][g]=f[h]}g++}}return b},E.toArray=E.toGrid,function(a){var b=function a(b,c,d,e){var f,g=d[c.y]?d[c.y][c.x]:void 0;return g?\"function\"==typeof e&&!0===(f=e(g,c,d))?[g]:(f=a(b,{x:c.x+b.x,y:c.y+b.y},d,e),f.unshift(g),f):[]};a.traverse=function(a,c,d,e){if(Array.isArray(c)&&(e=d,d=c,c={x:0,y:0}),\"string\"==typeof a)switch(a){case\"left\":a={x:-1,y:0};break;case\"up\":a={x:0,y:-1};break;case\"right\":a={x:1,y:0};break;case\"down\":a={x:0,y:1}}return b(a,{x:c.x+a.x,y:c.y+a.y},d,e)}}(E);var K={submit:\"Submit\",reset:\"Reset\"},L=[\"text\",\"search\",\"tel\",\"url\",\"email\",\"date\",\"time\",\"number\",\"range\",\"color\"],M=[\"A\",\"EM\",\"STRONG\",\"SMALL\",\"MARK\",\"ABBR\",\"DFN\",\"I\",\"B\",\"S\",\"U\",\"CODE\",\"VAR\",\"SAMP\",\"KBD\",\"SUP\",\"SUB\",\"Q\",\"CITE\",\"SPAN\",\"BDO\",\"BDI\",\"BR\",\"WBR\",\"INS\",\"DEL\",\"IMG\",\"EMBED\",\"OBJECT\",\"IFRAME\",\"MAP\",\"AREA\",\"SCRIPT\",\"NOSCRIPT\",\"RUBY\",\"VIDEO\",\"AUDIO\",\"INPUT\",\"TEXTAREA\",\"SELECT\",\"BUTTON\",\"LABEL\",\"OUTPUT\",\"DATALIST\",\"KEYGEN\",\"PROGRESS\",\"COMMAND\",\"CANVAS\",\"TIME\",\"METER\"];F.accessibleText=function(a,b){var c=axe.utils.getNodeFromTree(axe._tree[0],a);return axe.commons.text.accessibleTextVirtual(c,b)},F.accessibleTextVirtual=function(a,b){function c(a,b,c){return a.children.reduce(function(a,d){var e=d.actualNode;return 3===e.nodeType?a+=e.nodeValue:1===e.nodeType&&(M.includes(e.nodeName.toUpperCase())||(a+=\" \"),a+=g(d,b,c)),a},\"\")}function d(a){return axe.commons.table.isDataTable(a.actualNode)||1!==axe.commons.table.getAllCells(a.actualNode).length?\"\":c(a,!1,!1).trim()}function e(a,b,e){var f=\"\",h=a.actualNode,i=h.nodeName.toUpperCase();if(t(a)&&(f=c(a,!1,!1)||\"\",z(f)))return f;if(\"FIGURE\"===i&&(f=w(a,\"figcaption\"),z(f)))return f;if(\"TABLE\"===i){if(f=w(a,\"caption\"),z(f))return f;if(f=h.getAttribute(\"title\")||h.getAttribute(\"summary\")||d(a)||\"\",z(f))return f}if(y(a))return h.getAttribute(\"alt\")||\"\";if(s(a)&&!e){if(r(a))return h.value||h.title||K[h.type]||\"\";var j=q(a);if(j)return g(j,b,!0)}return\"\"}function f(a,b,c){var d=\"\",e=a.actualNode;return!b&&e.hasAttribute(\"aria-labelledby\")&&(d=F.sanitize(D.idrefs(e,\"aria-labelledby\").map(function(a){if(null!==a){e===a&&h.pop();var b=axe.utils.getNodeFromTree(axe._tree[0],a);return g(b,!0,e!==a)}return\"\"}).join(\" \"))),d||c&&x(a)||!e.hasAttribute(\"aria-label\")?d:F.sanitize(e.getAttribute(\"aria-label\"))}var g=void 0,h=[];return a instanceof Node&&(a=axe.utils.getNodeFromTree(axe._tree[0],a)),g=function(a,b,d){var g=void 0;if(!a||h.includes(a))return\"\";if(null!==a&&a.actualNode instanceof Node!=!0)throw new Error(\"Invalid argument. Virtual Node must be provided\");if(!b&&!D.isVisible(a.actualNode,!0))return\"\";h.push(a);var i=a.actualNode.getAttribute(\"role\");return g=f(a,b,d),z(g)?g:(g=e(a,b,d),z(g)?g:d&&(g=v(a),z(g))?g:u(a)||i&&-1===A.getRolesWithNameFromContents().indexOf(i)||(g=c(a,b,d),!z(g))?a.actualNode.hasAttribute(\"title\")?a.actualNode.getAttribute(\"title\"):\"\":g)},F.sanitize(g(a,b))},F.labelVirtual=function(a){var b,c,d;if(c=A.labelVirtual(a))return c;if(a.actualNode.id){var e=axe.commons.utils.escapeSelector(a.actualNode.getAttribute(\"id\"));if(d=axe.commons.dom.getRootNode(a.actualNode),b=d.querySelector('label[for=\"'+e+'\"]'),c=b&&F.visible(b,!0))return c}return b=D.findUpVirtual(a,\"label\"),(c=b&&F.visible(b,!0))||null},F.label=function(a){return a=axe.utils.getNodeFromTree(axe._tree[0],a),F.labelVirtual(a)},F.sanitize=function(a){\"use strict\";return a.replace(/\\r\\n/g,\"\\n\").replace(/\\u00A0/g,\" \").replace(/[\\s]{2,}/g,\" \").trim()},F.visibleVirtual=function(a,b,c){var d=a.children.map(function(d){if(3===d.actualNode.nodeType){var e=d.actualNode.nodeValue;if(e&&D.isVisible(a.actualNode,b))return e}else if(!c)return F.visibleVirtual(d,b)}).join(\"\");return F.sanitize(d)},F.visible=function(a,b,c){return a=axe.utils.getNodeFromTree(axe._tree[0],a),F.visibleVirtual(a,b,c)},axe.utils.tokenList=function(a){\"use strict\";return a.trim().replace(/\\s{2,}/g,\" \").split(\" \")}\n;var N=[\"aa\",\"ab\",\"ae\",\"af\",\"ak\",\"am\",\"an\",\"ar\",\"as\",\"av\",\"ay\",\"az\",\"ba\",\"be\",\"bg\",\"bh\",\"bi\",\"bm\",\"bn\",\"bo\",\"br\",\"bs\",\"ca\",\"ce\",\"ch\",\"co\",\"cr\",\"cs\",\"cu\",\"cv\",\"cy\",\"da\",\"de\",\"dv\",\"dz\",\"ee\",\"el\",\"en\",\"eo\",\"es\",\"et\",\"eu\",\"fa\",\"ff\",\"fi\",\"fj\",\"fo\",\"fr\",\"fy\",\"ga\",\"gd\",\"gl\",\"gn\",\"gu\",\"gv\",\"ha\",\"he\",\"hi\",\"ho\",\"hr\",\"ht\",\"hu\",\"hy\",\"hz\",\"ia\",\"id\",\"ie\",\"ig\",\"ii\",\"ik\",\"in\",\"io\",\"is\",\"it\",\"iu\",\"iw\",\"ja\",\"ji\",\"jv\",\"jw\",\"ka\",\"kg\",\"ki\",\"kj\",\"kk\",\"kl\",\"km\",\"kn\",\"ko\",\"kr\",\"ks\",\"ku\",\"kv\",\"kw\",\"ky\",\"la\",\"lb\",\"lg\",\"li\",\"ln\",\"lo\",\"lt\",\"lu\",\"lv\",\"mg\",\"mh\",\"mi\",\"mk\",\"ml\",\"mn\",\"mo\",\"mr\",\"ms\",\"mt\",\"my\",\"na\",\"nb\",\"nd\",\"ne\",\"ng\",\"nl\",\"nn\",\"no\",\"nr\",\"nv\",\"ny\",\"oc\",\"oj\",\"om\",\"or\",\"os\",\"pa\",\"pi\",\"pl\",\"ps\",\"pt\",\"qu\",\"rm\",\"rn\",\"ro\",\"ru\",\"rw\",\"sa\",\"sc\",\"sd\",\"se\",\"sg\",\"sh\",\"si\",\"sk\",\"sl\",\"sm\",\"sn\",\"so\",\"sq\",\"sr\",\"ss\",\"st\",\"su\",\"sv\",\"sw\",\"ta\",\"te\",\"tg\",\"th\",\"ti\",\"tk\",\"tl\",\"tn\",\"to\",\"tr\",\"ts\",\"tt\",\"tw\",\"ty\",\"ug\",\"uk\",\"ur\",\"uz\",\"ve\",\"vi\",\"vo\",\"wa\",\"wo\",\"xh\",\"yi\",\"yo\",\"za\",\"zh\",\"zu\",\"aaa\",\"aab\",\"aac\",\"aad\",\"aae\",\"aaf\",\"aag\",\"aah\",\"aai\",\"aak\",\"aal\",\"aam\",\"aan\",\"aao\",\"aap\",\"aaq\",\"aas\",\"aat\",\"aau\",\"aav\",\"aaw\",\"aax\",\"aaz\",\"aba\",\"abb\",\"abc\",\"abd\",\"abe\",\"abf\",\"abg\",\"abh\",\"abi\",\"abj\",\"abl\",\"abm\",\"abn\",\"abo\",\"abp\",\"abq\",\"abr\",\"abs\",\"abt\",\"abu\",\"abv\",\"abw\",\"abx\",\"aby\",\"abz\",\"aca\",\"acb\",\"acd\",\"ace\",\"acf\",\"ach\",\"aci\",\"ack\",\"acl\",\"acm\",\"acn\",\"acp\",\"acq\",\"acr\",\"acs\",\"act\",\"acu\",\"acv\",\"acw\",\"acx\",\"acy\",\"acz\",\"ada\",\"adb\",\"add\",\"ade\",\"adf\",\"adg\",\"adh\",\"adi\",\"adj\",\"adl\",\"adn\",\"ado\",\"adp\",\"adq\",\"adr\",\"ads\",\"adt\",\"adu\",\"adw\",\"adx\",\"ady\",\"adz\",\"aea\",\"aeb\",\"aec\",\"aed\",\"aee\",\"aek\",\"ael\",\"aem\",\"aen\",\"aeq\",\"aer\",\"aes\",\"aeu\",\"aew\",\"aey\",\"aez\",\"afa\",\"afb\",\"afd\",\"afe\",\"afg\",\"afh\",\"afi\",\"afk\",\"afn\",\"afo\",\"afp\",\"afs\",\"aft\",\"afu\",\"afz\",\"aga\",\"agb\",\"agc\",\"agd\",\"age\",\"agf\",\"agg\",\"agh\",\"agi\",\"agj\",\"agk\",\"agl\",\"agm\",\"agn\",\"ago\",\"agp\",\"agq\",\"agr\",\"ags\",\"agt\",\"agu\",\"agv\",\"agw\",\"agx\",\"agy\",\"agz\",\"aha\",\"ahb\",\"ahg\",\"ahh\",\"ahi\",\"ahk\",\"ahl\",\"ahm\",\"ahn\",\"aho\",\"ahp\",\"ahr\",\"ahs\",\"aht\",\"aia\",\"aib\",\"aic\",\"aid\",\"aie\",\"aif\",\"aig\",\"aih\",\"aii\",\"aij\",\"aik\",\"ail\",\"aim\",\"ain\",\"aio\",\"aip\",\"aiq\",\"air\",\"ais\",\"ait\",\"aiw\",\"aix\",\"aiy\",\"aja\",\"ajg\",\"aji\",\"ajn\",\"ajp\",\"ajt\",\"aju\",\"ajw\",\"ajz\",\"akb\",\"akc\",\"akd\",\"ake\",\"akf\",\"akg\",\"akh\",\"aki\",\"akj\",\"akk\",\"akl\",\"akm\",\"ako\",\"akp\",\"akq\",\"akr\",\"aks\",\"akt\",\"aku\",\"akv\",\"akw\",\"akx\",\"aky\",\"akz\",\"ala\",\"alc\",\"ald\",\"ale\",\"alf\",\"alg\",\"alh\",\"ali\",\"alj\",\"alk\",\"all\",\"alm\",\"aln\",\"alo\",\"alp\",\"alq\",\"alr\",\"als\",\"alt\",\"alu\",\"alv\",\"alw\",\"alx\",\"aly\",\"alz\",\"ama\",\"amb\",\"amc\",\"ame\",\"amf\",\"amg\",\"ami\",\"amj\",\"amk\",\"aml\",\"amm\",\"amn\",\"amo\",\"amp\",\"amq\",\"amr\",\"ams\",\"amt\",\"amu\",\"amv\",\"amw\",\"amx\",\"amy\",\"amz\",\"ana\",\"anb\",\"anc\",\"and\",\"ane\",\"anf\",\"ang\",\"anh\",\"ani\",\"anj\",\"ank\",\"anl\",\"anm\",\"ann\",\"ano\",\"anp\",\"anq\",\"anr\",\"ans\",\"ant\",\"anu\",\"anv\",\"anw\",\"anx\",\"any\",\"anz\",\"aoa\",\"aob\",\"aoc\",\"aod\",\"aoe\",\"aof\",\"aog\",\"aoh\",\"aoi\",\"aoj\",\"aok\",\"aol\",\"aom\",\"aon\",\"aor\",\"aos\",\"aot\",\"aou\",\"aox\",\"aoz\",\"apa\",\"apb\",\"apc\",\"apd\",\"ape\",\"apf\",\"apg\",\"aph\",\"api\",\"apj\",\"apk\",\"apl\",\"apm\",\"apn\",\"apo\",\"app\",\"apq\",\"apr\",\"aps\",\"apt\",\"apu\",\"apv\",\"apw\",\"apx\",\"apy\",\"apz\",\"aqa\",\"aqc\",\"aqd\",\"aqg\",\"aql\",\"aqm\",\"aqn\",\"aqp\",\"aqr\",\"aqt\",\"aqz\",\"arb\",\"arc\",\"ard\",\"are\",\"arh\",\"ari\",\"arj\",\"ark\",\"arl\",\"arn\",\"aro\",\"arp\",\"arq\",\"arr\",\"ars\",\"art\",\"aru\",\"arv\",\"arw\",\"arx\",\"ary\",\"arz\",\"asa\",\"asb\",\"asc\",\"asd\",\"ase\",\"asf\",\"asg\",\"ash\",\"asi\",\"asj\",\"ask\",\"asl\",\"asn\",\"aso\",\"asp\",\"asq\",\"asr\",\"ass\",\"ast\",\"asu\",\"asv\",\"asw\",\"asx\",\"asy\",\"asz\",\"ata\",\"atb\",\"atc\",\"atd\",\"ate\",\"atg\",\"ath\",\"ati\",\"atj\",\"atk\",\"atl\",\"atm\",\"atn\",\"ato\",\"atp\",\"atq\",\"atr\",\"ats\",\"att\",\"atu\",\"atv\",\"atw\",\"atx\",\"aty\",\"atz\",\"aua\",\"aub\",\"auc\",\"aud\",\"aue\",\"auf\",\"aug\",\"auh\",\"aui\",\"auj\",\"auk\",\"aul\",\"aum\",\"aun\",\"auo\",\"aup\",\"auq\",\"aur\",\"aus\",\"aut\",\"auu\",\"auw\",\"aux\",\"auy\",\"auz\",\"avb\",\"avd\",\"avi\",\"avk\",\"avl\",\"avm\",\"avn\",\"avo\",\"avs\",\"avt\",\"avu\",\"avv\",\"awa\",\"awb\",\"awc\",\"awd\",\"awe\",\"awg\",\"awh\",\"awi\",\"awk\",\"awm\",\"awn\",\"awo\",\"awr\",\"aws\",\"awt\",\"awu\",\"awv\",\"aww\",\"awx\",\"awy\",\"axb\",\"axe\",\"axg\",\"axk\",\"axl\",\"axm\",\"axx\",\"aya\",\"ayb\",\"ayc\",\"ayd\",\"aye\",\"ayg\",\"ayh\",\"ayi\",\"ayk\",\"ayl\",\"ayn\",\"ayo\",\"ayp\",\"ayq\",\"ayr\",\"ays\",\"ayt\",\"ayu\",\"ayx\",\"ayy\",\"ayz\",\"aza\",\"azb\",\"azc\",\"azd\",\"azg\",\"azj\",\"azm\",\"azn\",\"azo\",\"azt\",\"azz\",\"baa\",\"bab\",\"bac\",\"bad\",\"bae\",\"baf\",\"bag\",\"bah\",\"bai\",\"baj\",\"bal\",\"ban\",\"bao\",\"bap\",\"bar\",\"bas\",\"bat\",\"bau\",\"bav\",\"baw\",\"bax\",\"bay\",\"baz\",\"bba\",\"bbb\",\"bbc\",\"bbd\",\"bbe\",\"bbf\",\"bbg\",\"bbh\",\"bbi\",\"bbj\",\"bbk\",\"bbl\",\"bbm\",\"bbn\",\"bbo\",\"bbp\",\"bbq\",\"bbr\",\"bbs\",\"bbt\",\"bbu\",\"bbv\",\"bbw\",\"bbx\",\"bby\",\"bbz\",\"bca\",\"bcb\",\"bcc\",\"bcd\",\"bce\",\"bcf\",\"bcg\",\"bch\",\"bci\",\"bcj\",\"bck\",\"bcl\",\"bcm\",\"bcn\",\"bco\",\"bcp\",\"bcq\",\"bcr\",\"bcs\",\"bct\",\"bcu\",\"bcv\",\"bcw\",\"bcy\",\"bcz\",\"bda\",\"bdb\",\"bdc\",\"bdd\",\"bde\",\"bdf\",\"bdg\",\"bdh\",\"bdi\",\"bdj\",\"bdk\",\"bdl\",\"bdm\",\"bdn\",\"bdo\",\"bdp\",\"bdq\",\"bdr\",\"bds\",\"bdt\",\"bdu\",\"bdv\",\"bdw\",\"bdx\",\"bdy\",\"bdz\",\"bea\",\"beb\",\"bec\",\"bed\",\"bee\",\"bef\",\"beg\",\"beh\",\"bei\",\"bej\",\"bek\",\"bem\",\"beo\",\"bep\",\"beq\",\"ber\",\"bes\",\"bet\",\"beu\",\"bev\",\"bew\",\"bex\",\"bey\",\"bez\",\"bfa\",\"bfb\",\"bfc\",\"bfd\",\"bfe\",\"bff\",\"bfg\",\"bfh\",\"bfi\",\"bfj\",\"bfk\",\"bfl\",\"bfm\",\"bfn\",\"bfo\",\"bfp\",\"bfq\",\"bfr\",\"bfs\",\"bft\",\"bfu\",\"bfw\",\"bfx\",\"bfy\",\"bfz\",\"bga\",\"bgb\",\"bgc\",\"bgd\",\"bge\",\"bgf\",\"bgg\",\"bgi\",\"bgj\",\"bgk\",\"bgl\",\"bgm\",\"bgn\",\"bgo\",\"bgp\",\"bgq\",\"bgr\",\"bgs\",\"bgt\",\"bgu\",\"bgv\",\"bgw\",\"bgx\",\"bgy\",\"bgz\",\"bha\",\"bhb\",\"bhc\",\"bhd\",\"bhe\",\"bhf\",\"bhg\",\"bhh\",\"bhi\",\"bhj\",\"bhk\",\"bhl\",\"bhm\",\"bhn\",\"bho\",\"bhp\",\"bhq\",\"bhr\",\"bhs\",\"bht\",\"bhu\",\"bhv\",\"bhw\",\"bhx\",\"bhy\",\"bhz\",\"bia\",\"bib\",\"bic\",\"bid\",\"bie\",\"bif\",\"big\",\"bij\",\"bik\",\"bil\",\"bim\",\"bin\",\"bio\",\"bip\",\"biq\",\"bir\",\"bit\",\"biu\",\"biv\",\"biw\",\"bix\",\"biy\",\"biz\",\"bja\",\"bjb\",\"bjc\",\"bjd\",\"bje\",\"bjf\",\"bjg\",\"bjh\",\"bji\",\"bjj\",\"bjk\",\"bjl\",\"bjm\",\"bjn\",\"bjo\",\"bjp\",\"bjq\",\"bjr\",\"bjs\",\"bjt\",\"bju\",\"bjv\",\"bjw\",\"bjx\",\"bjy\",\"bjz\",\"bka\",\"bkb\",\"bkc\",\"bkd\",\"bkf\",\"bkg\",\"bkh\",\"bki\",\"bkj\",\"bkk\",\"bkl\",\"bkm\",\"bkn\",\"bko\",\"bkp\",\"bkq\",\"bkr\",\"bks\",\"bkt\",\"bku\",\"bkv\",\"bkw\",\"bkx\",\"bky\",\"bkz\",\"bla\",\"blb\",\"blc\",\"bld\",\"ble\",\"blf\",\"blg\",\"blh\",\"bli\",\"blj\",\"blk\",\"bll\",\"blm\",\"bln\",\"blo\",\"blp\",\"blq\",\"blr\",\"bls\",\"blt\",\"blv\",\"blw\",\"blx\",\"bly\",\"blz\",\"bma\",\"bmb\",\"bmc\",\"bmd\",\"bme\",\"bmf\",\"bmg\",\"bmh\",\"bmi\",\"bmj\",\"bmk\",\"bml\",\"bmm\",\"bmn\",\"bmo\",\"bmp\",\"bmq\",\"bmr\",\"bms\",\"bmt\",\"bmu\",\"bmv\",\"bmw\",\"bmx\",\"bmy\",\"bmz\",\"bna\",\"bnb\",\"bnc\",\"bnd\",\"bne\",\"bnf\",\"bng\",\"bni\",\"bnj\",\"bnk\",\"bnl\",\"bnm\",\"bnn\",\"bno\",\"bnp\",\"bnq\",\"bnr\",\"bns\",\"bnt\",\"bnu\",\"bnv\",\"bnw\",\"bnx\",\"bny\",\"bnz\",\"boa\",\"bob\",\"boe\",\"bof\",\"bog\",\"boh\",\"boi\",\"boj\",\"bok\",\"bol\",\"bom\",\"bon\",\"boo\",\"bop\",\"boq\",\"bor\",\"bot\",\"bou\",\"bov\",\"bow\",\"box\",\"boy\",\"boz\",\"bpa\",\"bpb\",\"bpd\",\"bpg\",\"bph\",\"bpi\",\"bpj\",\"bpk\",\"bpl\",\"bpm\",\"bpn\",\"bpo\",\"bpp\",\"bpq\",\"bpr\",\"bps\",\"bpt\",\"bpu\",\"bpv\",\"bpw\",\"bpx\",\"bpy\",\"bpz\",\"bqa\",\"bqb\",\"bqc\",\"bqd\",\"bqf\",\"bqg\",\"bqh\",\"bqi\",\"bqj\",\"bqk\",\"bql\",\"bqm\",\"bqn\",\"bqo\",\"bqp\",\"bqq\",\"bqr\",\"bqs\",\"bqt\",\"bqu\",\"bqv\",\"bqw\",\"bqx\",\"bqy\",\"bqz\",\"bra\",\"brb\",\"brc\",\"brd\",\"brf\",\"brg\",\"brh\",\"bri\",\"brj\",\"brk\",\"brl\",\"brm\",\"brn\",\"bro\",\"brp\",\"brq\",\"brr\",\"brs\",\"brt\",\"bru\",\"brv\",\"brw\",\"brx\",\"bry\",\"brz\",\"bsa\",\"bsb\",\"bsc\",\"bse\",\"bsf\",\"bsg\",\"bsh\",\"bsi\",\"bsj\",\"bsk\",\"bsl\",\"bsm\",\"bsn\",\"bso\",\"bsp\",\"bsq\",\"bsr\",\"bss\",\"bst\",\"bsu\",\"bsv\",\"bsw\",\"bsx\",\"bsy\",\"bta\",\"btb\",\"btc\",\"btd\",\"bte\",\"btf\",\"btg\",\"bth\",\"bti\",\"btj\",\"btk\",\"btl\",\"btm\",\"btn\",\"bto\",\"btp\",\"btq\",\"btr\",\"bts\",\"btt\",\"btu\",\"btv\",\"btw\",\"btx\",\"bty\",\"btz\",\"bua\",\"bub\",\"buc\",\"bud\",\"bue\",\"buf\",\"bug\",\"buh\",\"bui\",\"buj\",\"buk\",\"bum\",\"bun\",\"buo\",\"bup\",\"buq\",\"bus\",\"but\",\"buu\",\"buv\",\"buw\",\"bux\",\"buy\",\"buz\",\"bva\",\"bvb\",\"bvc\",\"bvd\",\"bve\",\"bvf\",\"bvg\",\"bvh\",\"bvi\",\"bvj\",\"bvk\",\"bvl\",\"bvm\",\"bvn\",\"bvo\",\"bvp\",\"bvq\",\"bvr\",\"bvt\",\"bvu\",\"bvv\",\"bvw\",\"bvx\",\"bvy\",\"bvz\",\"bwa\",\"bwb\",\"bwc\",\"bwd\",\"bwe\",\"bwf\",\"bwg\",\"bwh\",\"bwi\",\"bwj\",\"bwk\",\"bwl\",\"bwm\",\"bwn\",\"bwo\",\"bwp\",\"bwq\",\"bwr\",\"bws\",\"bwt\",\"bwu\",\"bww\",\"bwx\",\"bwy\",\"bwz\",\"bxa\",\"bxb\",\"bxc\",\"bxd\",\"bxe\",\"bxf\",\"bxg\",\"bxh\",\"bxi\",\"bxj\",\"bxk\",\"bxl\",\"bxm\",\"bxn\",\"bxo\",\"bxp\",\"bxq\",\"bxr\",\"bxs\",\"bxu\",\"bxv\",\"bxw\",\"bxx\",\"bxz\",\"bya\",\"byb\",\"byc\",\"byd\",\"bye\",\"byf\",\"byg\",\"byh\",\"byi\",\"byj\",\"byk\",\"byl\",\"bym\",\"byn\",\"byo\",\"byp\",\"byq\",\"byr\",\"bys\",\"byt\",\"byv\",\"byw\",\"byx\",\"byy\",\"byz\",\"bza\",\"bzb\",\"bzc\",\"bzd\",\"bze\",\"bzf\",\"bzg\",\"bzh\",\"bzi\",\"bzj\",\"bzk\",\"bzl\",\"bzm\",\"bzn\",\"bzo\",\"bzp\",\"bzq\",\"bzr\",\"bzs\",\"bzt\",\"bzu\",\"bzv\",\"bzw\",\"bzx\",\"bzy\",\"bzz\",\"caa\",\"cab\",\"cac\",\"cad\",\"cae\",\"caf\",\"cag\",\"cah\",\"cai\",\"caj\",\"cak\",\"cal\",\"cam\",\"can\",\"cao\",\"cap\",\"caq\",\"car\",\"cas\",\"cau\",\"cav\",\"caw\",\"cax\",\"cay\",\"caz\",\"cba\",\"cbb\",\"cbc\",\"cbd\",\"cbe\",\"cbg\",\"cbh\",\"cbi\",\"cbj\",\"cbk\",\"cbl\",\"cbn\",\"cbo\",\"cbq\",\"cbr\",\"cbs\",\"cbt\",\"cbu\",\"cbv\",\"cbw\",\"cby\",\"cca\",\"ccc\",\"ccd\",\"cce\",\"ccg\",\"cch\",\"ccj\",\"ccl\",\"ccm\",\"ccn\",\"cco\",\"ccp\",\"ccq\",\"ccr\",\"ccs\",\"cda\",\"cdc\",\"cdd\",\"cde\",\"cdf\",\"cdg\",\"cdh\",\"cdi\",\"cdj\",\"cdm\",\"cdn\",\"cdo\",\"cdr\",\"cds\",\"cdy\",\"cdz\",\"cea\",\"ceb\",\"ceg\",\"cek\",\"cel\",\"cen\",\"cet\",\"cfa\",\"cfd\",\"cfg\",\"cfm\",\"cga\",\"cgc\",\"cgg\",\"cgk\",\"chb\",\"chc\",\"chd\",\"chf\",\"chg\",\"chh\",\"chj\",\"chk\",\"chl\",\"chm\",\"chn\",\"cho\",\"chp\",\"chq\",\"chr\",\"cht\",\"chw\",\"chx\",\"chy\",\"chz\",\"cia\",\"cib\",\"cic\",\"cid\",\"cie\",\"cih\",\"cik\",\"cim\",\"cin\",\"cip\",\"cir\",\"ciw\",\"ciy\",\"cja\",\"cje\",\"cjh\",\"cji\",\"cjk\",\"cjm\",\"cjn\",\"cjo\",\"cjp\",\"cjr\",\"cjs\",\"cjv\",\"cjy\",\"cka\",\"ckb\",\"ckh\",\"ckl\",\"ckn\",\"cko\",\"ckq\",\"ckr\",\"cks\",\"ckt\",\"cku\",\"ckv\",\"ckx\",\"cky\",\"ckz\",\"cla\",\"clc\",\"cld\",\"cle\",\"clh\",\"cli\",\"clj\",\"clk\",\"cll\",\"clm\",\"clo\",\"clt\",\"clu\",\"clw\",\"cly\",\"cma\",\"cmc\",\"cme\",\"cmg\",\"cmi\",\"cmk\",\"cml\",\"cmm\",\"cmn\",\"cmo\",\"cmr\",\"cms\",\"cmt\",\"cna\",\"cnb\",\"cnc\",\"cng\",\"cnh\",\"cni\",\"cnk\",\"cnl\",\"cno\",\"cns\",\"cnt\",\"cnu\",\"cnw\",\"cnx\",\"coa\",\"cob\",\"coc\",\"cod\",\"coe\",\"cof\",\"cog\",\"coh\",\"coj\",\"cok\",\"col\",\"com\",\"con\",\"coo\",\"cop\",\"coq\",\"cot\",\"cou\",\"cov\",\"cow\",\"cox\",\"coy\",\"coz\",\"cpa\",\"cpb\",\"cpc\",\"cpe\",\"cpf\",\"cpg\",\"cpi\",\"cpn\",\"cpo\",\"cpp\",\"cps\",\"cpu\",\"cpx\",\"cpy\",\"cqd\",\"cqu\",\"cra\",\"crb\",\"crc\",\"crd\",\"crf\",\"crg\",\"crh\",\"cri\",\"crj\",\"crk\",\"crl\",\"crm\",\"crn\",\"cro\",\"crp\",\"crq\",\"crr\",\"crs\",\"crt\",\"crv\",\"crw\",\"crx\",\"cry\",\"crz\",\"csa\",\"csb\",\"csc\",\"csd\",\"cse\",\"csf\",\"csg\",\"csh\",\"csi\",\"csj\",\"csk\",\"csl\",\"csm\",\"csn\",\"cso\",\"csq\",\"csr\",\"css\",\"cst\",\"csu\",\"csv\",\"csw\",\"csy\",\"csz\",\"cta\",\"ctc\",\"ctd\",\"cte\",\"ctg\",\"cth\",\"ctl\",\"ctm\",\"ctn\",\"cto\",\"ctp\",\"cts\",\"ctt\",\"ctu\",\"ctz\",\"cua\",\"cub\",\"cuc\",\"cug\",\"cuh\",\"cui\",\"cuj\",\"cuk\",\"cul\",\"cum\",\"cuo\",\"cup\",\"cuq\",\"cur\",\"cus\",\"cut\",\"cuu\",\"cuv\",\"cuw\",\"cux\",\"cvg\",\"cvn\",\"cwa\",\"cwb\",\"cwd\",\"cwe\",\"cwg\",\"cwt\",\"cya\",\"cyb\",\"cyo\",\"czh\",\"czk\",\"czn\",\"czo\",\"czt\",\"daa\",\"dac\",\"dad\",\"dae\",\"daf\",\"dag\",\"dah\",\"dai\",\"daj\",\"dak\",\"dal\",\"dam\",\"dao\",\"dap\",\"daq\",\"dar\",\"das\",\"dau\",\"dav\",\"daw\",\"dax\",\"day\",\"daz\",\"dba\",\"dbb\",\"dbd\",\"dbe\",\"dbf\",\"dbg\",\"dbi\",\"dbj\",\"dbl\",\"dbm\",\"dbn\",\"dbo\",\"dbp\",\"dbq\",\"dbr\",\"dbt\",\"dbu\",\"dbv\",\"dbw\",\"dby\",\"dcc\",\"dcr\",\"dda\",\"ddd\",\"dde\",\"ddg\",\"ddi\",\"ddj\",\"ddn\",\"ddo\",\"ddr\",\"dds\",\"ddw\",\"dec\",\"ded\",\"dee\",\"def\",\"deg\",\"deh\",\"dei\",\"dek\",\"del\",\"dem\",\"den\",\"dep\",\"deq\",\"der\",\"des\",\"dev\",\"dez\",\"dga\",\"dgb\",\"dgc\",\"dgd\",\"dge\",\"dgg\",\"dgh\",\"dgi\",\"dgk\",\"dgl\",\"dgn\",\"dgo\",\"dgr\",\"dgs\",\"dgt\",\"dgu\",\"dgw\",\"dgx\",\"dgz\",\"dha\",\"dhd\",\"dhg\",\"dhi\",\"dhl\",\"dhm\",\"dhn\",\"dho\",\"dhr\",\"dhs\",\"dhu\",\"dhv\",\"dhw\",\"dhx\",\"dia\",\"dib\",\"dic\",\"did\",\"dif\",\"dig\",\"dih\",\"dii\",\"dij\",\"dik\",\"dil\",\"dim\",\"din\",\"dio\",\"dip\",\"diq\",\"dir\",\"dis\",\"dit\",\"diu\",\"diw\",\"dix\",\"diy\",\"diz\",\"dja\",\"djb\",\"djc\",\"djd\",\"dje\",\"djf\",\"dji\",\"djj\",\"djk\",\"djl\",\"djm\",\"djn\",\"djo\",\"djr\",\"dju\",\"djw\",\"dka\",\"dkk\",\"dkl\",\"dkr\",\"dks\",\"dkx\",\"dlg\",\"dlk\",\"dlm\",\"dln\",\"dma\",\"dmb\",\"dmc\",\"dmd\",\"dme\",\"dmg\",\"dmk\",\"dml\",\"dmm\",\"dmn\",\"dmo\",\"dmr\",\"dms\",\"dmu\",\"dmv\",\"dmw\",\"dmx\",\"dmy\",\"dna\",\"dnd\",\"dne\",\"dng\",\"dni\",\"dnj\",\"dnk\",\"dnn\",\"dnr\",\"dnt\",\"dnu\",\"dnv\",\"dnw\",\"dny\",\"doa\",\"dob\",\"doc\",\"doe\",\"dof\",\"doh\",\"doi\",\"dok\",\"dol\",\"don\",\"doo\",\"dop\",\"doq\",\"dor\",\"dos\",\"dot\",\"dov\",\"dow\",\"dox\",\"doy\",\"doz\",\"dpp\",\"dra\",\"drb\",\"drc\",\"drd\",\"dre\",\"drg\",\"drh\",\"dri\",\"drl\",\"drn\",\"dro\",\"drq\",\"drr\",\"drs\",\"drt\",\"dru\",\"drw\",\"dry\",\"dsb\",\"dse\",\"dsh\",\"dsi\",\"dsl\",\"dsn\",\"dso\",\"dsq\",\"dta\",\"dtb\",\"dtd\",\"dth\",\"dti\",\"dtk\",\"dtm\",\"dtn\",\"dto\",\"dtp\",\"dtr\",\"dts\",\"dtt\",\"dtu\",\"dty\",\"dua\",\"dub\",\"duc\",\"dud\",\"due\",\"duf\",\"dug\",\"duh\",\"dui\",\"duj\",\"duk\",\"dul\",\"dum\",\"dun\",\"duo\",\"dup\",\"duq\",\"dur\",\"dus\",\"duu\",\"duv\",\"duw\",\"dux\",\"duy\",\"duz\",\"dva\",\"dwa\",\"dwl\",\"dwr\",\"dws\",\"dwu\",\"dww\",\"dwy\",\"dya\",\"dyb\",\"dyd\",\"dyg\",\"dyi\",\"dym\",\"dyn\",\"dyo\",\"dyu\",\"dyy\",\"dza\",\"dzd\",\"dze\",\"dzg\",\"dzl\",\"dzn\",\"eaa\",\"ebg\",\"ebk\",\"ebo\",\"ebr\",\"ebu\",\"ecr\",\"ecs\",\"ecy\",\"eee\",\"efa\",\"efe\",\"efi\",\"ega\",\"egl\",\"ego\",\"egx\",\"egy\",\"ehu\",\"eip\",\"eit\",\"eiv\",\"eja\",\"eka\",\"ekc\",\"eke\",\"ekg\",\"eki\",\"ekk\",\"ekl\",\"ekm\",\"eko\",\"ekp\",\"ekr\",\"eky\",\"ele\",\"elh\",\"eli\",\"elk\",\"elm\",\"elo\",\"elp\",\"elu\",\"elx\",\"ema\",\"emb\",\"eme\",\"emg\",\"emi\",\"emk\",\"emm\",\"emn\",\"emo\",\"emp\",\"ems\",\"emu\",\"emw\",\"emx\",\"emy\",\"ena\",\"enb\",\"enc\",\"end\",\"enf\",\"enh\",\"enl\",\"enm\",\"enn\",\"eno\",\"enq\",\"enr\",\"enu\",\"env\",\"enw\",\"enx\",\"eot\",\"epi\",\"era\",\"erg\",\"erh\",\"eri\",\"erk\",\"ero\",\"err\",\"ers\",\"ert\",\"erw\",\"ese\",\"esg\",\"esh\",\"esi\",\"esk\",\"esl\",\"esm\",\"esn\",\"eso\",\"esq\",\"ess\",\"esu\",\"esx\",\"esy\",\"etb\",\"etc\",\"eth\",\"etn\",\"eto\",\"etr\",\"ets\",\"ett\",\"etu\",\"etx\",\"etz\",\"euq\",\"eve\",\"evh\",\"evn\",\"ewo\",\"ext\",\"eya\",\"eyo\",\"eza\",\"eze\",\"faa\",\"fab\",\"fad\",\"faf\",\"fag\",\"fah\",\"fai\",\"faj\",\"fak\",\"fal\",\"fam\",\"fan\",\"fap\",\"far\",\"fat\",\"fau\",\"fax\",\"fay\",\"faz\",\"fbl\",\"fcs\",\"fer\",\"ffi\",\"ffm\",\"fgr\",\"fia\",\"fie\",\"fil\",\"fip\",\"fir\",\"fit\",\"fiu\",\"fiw\",\"fkk\",\"fkv\",\"fla\",\"flh\",\"fli\",\"fll\",\"fln\",\"flr\",\"fly\",\"fmp\",\"fmu\",\"fnb\",\"fng\",\"fni\",\"fod\",\"foi\",\"fom\",\"fon\",\"for\",\"fos\",\"fox\",\"fpe\",\"fqs\",\"frc\",\"frd\",\"frk\",\"frm\",\"fro\",\"frp\",\"frq\",\"frr\",\"frs\",\"frt\",\"fse\",\"fsl\",\"fss\",\"fub\",\"fuc\",\"fud\",\"fue\",\"fuf\",\"fuh\",\"fui\",\"fuj\",\"fum\",\"fun\",\"fuq\",\"fur\",\"fut\",\"fuu\",\"fuv\",\"fuy\",\"fvr\",\"fwa\",\"fwe\",\"gaa\",\"gab\",\"gac\",\"gad\",\"gae\",\"gaf\",\"gag\",\"gah\",\"gai\",\"gaj\",\"gak\",\"gal\",\"gam\",\"gan\",\"gao\",\"gap\",\"gaq\",\"gar\",\"gas\",\"gat\",\"gau\",\"gav\",\"gaw\",\"gax\",\"gay\",\"gaz\",\"gba\",\"gbb\",\"gbc\",\"gbd\",\"gbe\",\"gbf\",\"gbg\",\"gbh\",\"gbi\",\"gbj\",\"gbk\",\"gbl\",\"gbm\",\"gbn\",\"gbo\",\"gbp\",\"gbq\",\"gbr\",\"gbs\",\"gbu\",\"gbv\",\"gbw\",\"gbx\",\"gby\",\"gbz\",\"gcc\",\"gcd\",\"gce\",\"gcf\",\"gcl\",\"gcn\",\"gcr\",\"gct\",\"gda\",\"gdb\",\"gdc\",\"gdd\",\"gde\",\"gdf\",\"gdg\",\"gdh\",\"gdi\",\"gdj\",\"gdk\",\"gdl\",\"gdm\",\"gdn\",\"gdo\",\"gdq\",\"gdr\",\"gds\",\"gdt\",\"gdu\",\"gdx\",\"gea\",\"geb\",\"gec\",\"ged\",\"geg\",\"geh\",\"gei\",\"gej\",\"gek\",\"gel\",\"gem\",\"geq\",\"ges\",\"gev\",\"gew\",\"gex\",\"gey\",\"gez\",\"gfk\",\"gft\",\"gfx\",\"gga\",\"ggb\",\"ggd\",\"gge\",\"ggg\",\"ggk\",\"ggl\",\"ggn\",\"ggo\",\"ggr\",\"ggt\",\"ggu\",\"ggw\",\"gha\",\"ghc\",\"ghe\",\"ghh\",\"ghk\",\"ghl\",\"ghn\",\"gho\",\"ghr\",\"ghs\",\"ght\",\"gia\",\"gib\",\"gic\",\"gid\",\"gie\",\"gig\",\"gih\",\"gil\",\"gim\",\"gin\",\"gio\",\"gip\",\"giq\",\"gir\",\"gis\",\"git\",\"giu\",\"giw\",\"gix\",\"giy\",\"giz\",\"gji\",\"gjk\",\"gjm\",\"gjn\",\"gjr\",\"gju\",\"gka\",\"gke\",\"gkn\",\"gko\",\"gkp\",\"gku\",\"glc\",\"gld\",\"glh\",\"gli\",\"glj\",\"glk\",\"gll\",\"glo\",\"glr\",\"glu\",\"glw\",\"gly\",\"gma\",\"gmb\",\"gmd\",\"gme\",\"gmg\",\"gmh\",\"gml\",\"gmm\",\"gmn\",\"gmq\",\"gmu\",\"gmv\",\"gmw\",\"gmx\",\"gmy\",\"gmz\",\"gna\",\"gnb\",\"gnc\",\"gnd\",\"gne\",\"gng\",\"gnh\",\"gni\",\"gnk\",\"gnl\",\"gnm\",\"gnn\",\"gno\",\"gnq\",\"gnr\",\"gnt\",\"gnu\",\"gnw\",\"gnz\",\"goa\",\"gob\",\"goc\",\"god\",\"goe\",\"gof\",\"gog\",\"goh\",\"goi\",\"goj\",\"gok\",\"gol\",\"gom\",\"gon\",\"goo\",\"gop\",\"goq\",\"gor\",\"gos\",\"got\",\"gou\",\"gow\",\"gox\",\"goy\",\"goz\",\"gpa\",\"gpe\",\"gpn\",\"gqa\",\"gqi\",\"gqn\",\"gqr\",\"gqu\",\"gra\",\"grb\",\"grc\",\"grd\",\"grg\",\"grh\",\"gri\",\"grj\",\"grk\",\"grm\",\"gro\",\"grq\",\"grr\",\"grs\",\"grt\",\"gru\",\"grv\",\"grw\",\"grx\",\"gry\",\"grz\",\"gse\",\"gsg\",\"gsl\",\"gsm\",\"gsn\",\"gso\",\"gsp\",\"gss\",\"gsw\",\"gta\",\"gti\",\"gtu\",\"gua\",\"gub\",\"guc\",\"gud\",\"gue\",\"guf\",\"gug\",\"guh\",\"gui\",\"guk\",\"gul\",\"gum\",\"gun\",\"guo\",\"gup\",\"guq\",\"gur\",\"gus\",\"gut\",\"guu\",\"guv\",\"guw\",\"gux\",\"guz\",\"gva\",\"gvc\",\"gve\",\"gvf\",\"gvj\",\"gvl\",\"gvm\",\"gvn\",\"gvo\",\"gvp\",\"gvr\",\"gvs\",\"gvy\",\"gwa\",\"gwb\",\"gwc\",\"gwd\",\"gwe\",\"gwf\",\"gwg\",\"gwi\",\"gwj\",\"gwm\",\"gwn\",\"gwr\",\"gwt\",\"gwu\",\"gww\",\"gwx\",\"gxx\",\"gya\",\"gyb\",\"gyd\",\"gye\",\"gyf\",\"gyg\",\"gyi\",\"gyl\",\"gym\",\"gyn\",\"gyr\",\"gyy\",\"gza\",\"gzi\",\"gzn\",\"haa\",\"hab\",\"hac\",\"had\",\"hae\",\"haf\",\"hag\",\"hah\",\"hai\",\"haj\",\"hak\",\"hal\",\"ham\",\"han\",\"hao\",\"hap\",\"haq\",\"har\",\"has\",\"hav\",\"haw\",\"hax\",\"hay\",\"haz\",\"hba\",\"hbb\",\"hbn\",\"hbo\",\"hbu\",\"hca\",\"hch\",\"hdn\",\"hds\",\"hdy\",\"hea\",\"hed\",\"heg\",\"heh\",\"hei\",\"hem\",\"hgm\",\"hgw\",\"hhi\",\"hhr\",\"hhy\",\"hia\",\"hib\",\"hid\",\"hif\",\"hig\",\"hih\",\"hii\",\"hij\",\"hik\",\"hil\",\"him\",\"hio\",\"hir\",\"hit\",\"hiw\",\"hix\",\"hji\",\"hka\",\"hke\",\"hkk\",\"hks\",\"hla\",\"hlb\",\"hld\",\"hle\",\"hlt\",\"hlu\",\"hma\",\"hmb\",\"hmc\",\"hmd\",\"hme\",\"hmf\",\"hmg\",\"hmh\",\"hmi\",\"hmj\",\"hmk\",\"hml\",\"hmm\",\"hmn\",\"hmp\",\"hmq\",\"hmr\",\"hms\",\"hmt\",\"hmu\",\"hmv\",\"hmw\",\"hmx\",\"hmy\",\"hmz\",\"hna\",\"hnd\",\"hne\",\"hnh\",\"hni\",\"hnj\",\"hnn\",\"hno\",\"hns\",\"hnu\",\"hoa\",\"hob\",\"hoc\",\"hod\",\"hoe\",\"hoh\",\"hoi\",\"hoj\",\"hok\",\"hol\",\"hom\",\"hoo\",\"hop\",\"hor\",\"hos\",\"hot\",\"hov\",\"how\",\"hoy\",\"hoz\",\"hpo\",\"hps\",\"hra\",\"hrc\",\"hre\",\"hrk\",\"hrm\",\"hro\",\"hrp\",\"hrr\",\"hrt\",\"hru\",\"hrw\",\"hrx\",\"hrz\",\"hsb\",\"hsh\",\"hsl\",\"hsn\",\"hss\",\"hti\",\"hto\",\"hts\",\"htu\",\"htx\",\"hub\",\"huc\",\"hud\",\"hue\",\"huf\",\"hug\",\"huh\",\"hui\",\"huj\",\"huk\",\"hul\",\"hum\",\"huo\",\"hup\",\"huq\",\"hur\",\"hus\",\"hut\",\"huu\",\"huv\",\"huw\",\"hux\",\"huy\",\"huz\",\"hvc\",\"hve\",\"hvk\",\"hvn\",\"hvv\",\"hwa\",\"hwc\",\"hwo\",\"hya\",\"hyx\",\"iai\",\"ian\",\"iap\",\"iar\",\"iba\",\"ibb\",\"ibd\",\"ibe\",\"ibg\",\"ibh\",\"ibi\",\"ibl\",\"ibm\",\"ibn\",\"ibr\",\"ibu\",\"iby\",\"ica\",\"ich\",\"icl\",\"icr\",\"ida\",\"idb\",\"idc\",\"idd\",\"ide\",\"idi\",\"idr\",\"ids\",\"idt\",\"idu\",\"ifa\",\"ifb\",\"ife\",\"iff\",\"ifk\",\"ifm\",\"ifu\",\"ify\",\"igb\",\"ige\",\"igg\",\"igl\",\"igm\",\"ign\",\"igo\",\"igs\",\"igw\",\"ihb\",\"ihi\",\"ihp\",\"ihw\",\"iin\",\"iir\",\"ijc\",\"ije\",\"ijj\",\"ijn\",\"ijo\",\"ijs\",\"ike\",\"iki\",\"ikk\",\"ikl\",\"iko\",\"ikp\",\"ikr\",\"iks\",\"ikt\",\"ikv\",\"ikw\",\"ikx\",\"ikz\",\"ila\",\"ilb\",\"ilg\",\"ili\",\"ilk\",\"ill\",\"ilm\",\"ilo\",\"ilp\",\"ils\",\"ilu\",\"ilv\",\"ilw\",\"ima\",\"ime\",\"imi\",\"iml\",\"imn\",\"imo\",\"imr\",\"ims\",\"imy\",\"inb\",\"inc\",\"ine\",\"ing\",\"inh\",\"inj\",\"inl\",\"inm\",\"inn\",\"ino\",\"inp\",\"ins\",\"int\",\"inz\",\"ior\",\"iou\",\"iow\",\"ipi\",\"ipo\",\"iqu\",\"iqw\",\"ira\",\"ire\",\"irh\",\"iri\",\"irk\",\"irn\",\"iro\",\"irr\",\"iru\",\"irx\",\"iry\",\"isa\",\"isc\",\"isd\",\"ise\",\"isg\",\"ish\",\"isi\",\"isk\",\"ism\",\"isn\",\"iso\",\"isr\",\"ist\",\"isu\",\"itb\",\"itc\",\"itd\",\"ite\",\"iti\",\"itk\",\"itl\",\"itm\",\"ito\",\"itr\",\"its\",\"itt\",\"itv\",\"itw\",\"itx\",\"ity\",\"itz\",\"ium\",\"ivb\",\"ivv\",\"iwk\",\"iwm\",\"iwo\",\"iws\",\"ixc\",\"ixl\",\"iya\",\"iyo\",\"iyx\",\"izh\",\"izi\",\"izr\",\"izz\",\"jaa\",\"jab\",\"jac\",\"jad\",\"jae\",\"jaf\",\"jah\",\"jaj\",\"jak\",\"jal\",\"jam\",\"jan\",\"jao\",\"jaq\",\"jar\",\"jas\",\"jat\",\"jau\",\"jax\",\"jay\",\"jaz\",\"jbe\",\"jbi\",\"jbj\",\"jbk\",\"jbn\",\"jbo\",\"jbr\",\"jbt\",\"jbu\",\"jbw\",\"jcs\",\"jct\",\"jda\",\"jdg\",\"jdt\",\"jeb\",\"jee\",\"jeg\",\"jeh\",\"jei\",\"jek\",\"jel\",\"jen\",\"jer\",\"jet\",\"jeu\",\"jgb\",\"jge\",\"jgk\",\"jgo\",\"jhi\",\"jhs\",\"jia\",\"jib\",\"jic\",\"jid\",\"jie\",\"jig\",\"jih\",\"jii\",\"jil\",\"jim\",\"jio\",\"jiq\",\"jit\",\"jiu\",\"jiv\",\"jiy\",\"jje\",\"jjr\",\"jka\",\"jkm\",\"jko\",\"jkp\",\"jkr\",\"jku\",\"jle\",\"jls\",\"jma\",\"jmb\",\"jmc\",\"jmd\",\"jmi\",\"jml\",\"jmn\",\"jmr\",\"jms\",\"jmw\",\"jmx\",\"jna\",\"jnd\",\"jng\",\"jni\",\"jnj\",\"jnl\",\"jns\",\"job\",\"jod\",\"jog\",\"jor\",\"jos\",\"jow\",\"jpa\",\"jpr\",\"jpx\",\"jqr\",\"jra\",\"jrb\",\"jrr\",\"jrt\",\"jru\",\"jsl\",\"jua\",\"jub\",\"juc\",\"jud\",\"juh\",\"jui\",\"juk\",\"jul\",\"jum\",\"jun\",\"juo\",\"jup\",\"jur\",\"jus\",\"jut\",\"juu\",\"juw\",\"juy\",\"jvd\",\"jvn\",\"jwi\",\"jya\",\"jye\",\"jyy\",\"kaa\",\"kab\",\"kac\",\"kad\",\"kae\",\"kaf\",\"kag\",\"kah\",\"kai\",\"kaj\",\"kak\",\"kam\",\"kao\",\"kap\",\"kaq\",\"kar\",\"kav\",\"kaw\",\"kax\",\"kay\",\"kba\",\"kbb\",\"kbc\",\"kbd\",\"kbe\",\"kbf\",\"kbg\",\"kbh\",\"kbi\",\"kbj\",\"kbk\",\"kbl\",\"kbm\",\"kbn\",\"kbo\",\"kbp\",\"kbq\",\"kbr\",\"kbs\",\"kbt\",\"kbu\",\"kbv\",\"kbw\",\"kbx\",\"kby\",\"kbz\",\"kca\",\"kcb\",\"kcc\",\"kcd\",\"kce\",\"kcf\",\"kcg\",\"kch\",\"kci\",\"kcj\",\"kck\",\"kcl\",\"kcm\",\"kcn\",\"kco\",\"kcp\",\"kcq\",\"kcr\",\"kcs\",\"kct\",\"kcu\",\"kcv\",\"kcw\",\"kcx\",\"kcy\",\"kcz\",\"kda\",\"kdc\",\"kdd\",\"kde\",\"kdf\",\"kdg\",\"kdh\",\"kdi\",\"kdj\",\"kdk\",\"kdl\",\"kdm\",\"kdn\",\"kdo\",\"kdp\",\"kdq\",\"kdr\",\"kdt\",\"kdu\",\"kdv\",\"kdw\",\"kdx\",\"kdy\",\"kdz\",\"kea\",\"keb\",\"kec\",\"ked\",\"kee\",\"kef\",\"keg\",\"keh\",\"kei\",\"kej\",\"kek\",\"kel\",\"kem\",\"ken\",\"keo\",\"kep\",\"keq\",\"ker\",\"kes\",\"ket\",\"keu\",\"kev\",\"kew\",\"kex\",\"key\",\"kez\",\"kfa\",\"kfb\",\"kfc\",\"kfd\",\"kfe\",\"kff\",\"kfg\",\"kfh\",\"kfi\",\"kfj\",\"kfk\",\"kfl\",\"kfm\",\"kfn\",\"kfo\",\"kfp\",\"kfq\",\"kfr\",\"kfs\",\"kft\",\"kfu\",\"kfv\",\"kfw\",\"kfx\",\"kfy\",\"kfz\",\"kga\",\"kgb\",\"kgc\",\"kgd\",\"kge\",\"kgf\",\"kgg\",\"kgh\",\"kgi\",\"kgj\",\"kgk\",\"kgl\",\"kgm\",\"kgn\",\"kgo\",\"kgp\",\"kgq\",\"kgr\",\"kgs\",\"kgt\",\"kgu\",\"kgv\",\"kgw\",\"kgx\",\"kgy\",\"kha\",\"khb\",\"khc\",\"khd\",\"khe\",\"khf\",\"khg\",\"khh\",\"khi\",\"khj\",\"khk\",\"khl\",\"khn\",\"kho\",\"khp\",\"khq\",\"khr\",\"khs\",\"kht\",\"khu\",\"khv\",\"khw\",\"khx\",\"khy\",\"khz\",\"kia\",\"kib\",\"kic\",\"kid\",\"kie\",\"kif\",\"kig\",\"kih\",\"kii\",\"kij\",\"kil\",\"kim\",\"kio\",\"kip\",\"kiq\",\"kis\",\"kit\",\"kiu\",\"kiv\",\"kiw\",\"kix\",\"kiy\",\"kiz\",\"kja\",\"kjb\",\"kjc\",\"kjd\",\"kje\",\"kjf\",\"kjg\",\"kjh\",\"kji\",\"kjj\",\"kjk\",\"kjl\",\"kjm\",\"kjn\",\"kjo\",\"kjp\",\"kjq\",\"kjr\",\"kjs\",\"kjt\",\"kju\",\"kjv\",\"kjx\",\"kjy\",\"kjz\",\"kka\",\"kkb\",\"kkc\",\"kkd\",\"kke\",\"kkf\",\"kkg\",\"kkh\",\"kki\",\"kkj\",\"kkk\",\"kkl\",\"kkm\",\"kkn\",\"kko\",\"kkp\",\"kkq\",\"kkr\",\"kks\",\"kkt\",\"kku\",\"kkv\",\"kkw\",\"kkx\",\"kky\",\"kkz\",\"kla\",\"klb\",\"klc\",\"kld\",\"kle\",\"klf\",\"klg\",\"klh\",\"kli\",\"klj\",\"klk\",\"kll\",\"klm\",\"kln\",\"klo\",\"klp\",\"klq\",\"klr\",\"kls\",\"klt\",\"klu\",\"klv\",\"klw\",\"klx\",\"kly\",\"klz\",\"kma\",\"kmb\",\"kmc\",\"kmd\",\"kme\",\"kmf\",\"kmg\",\"kmh\",\"kmi\",\"kmj\",\"kmk\",\"kml\",\"kmm\",\"kmn\",\"kmo\",\"kmp\",\"kmq\",\"kmr\",\"kms\",\"kmt\",\"kmu\",\"kmv\",\"kmw\",\"kmx\",\"kmy\",\"kmz\",\"kna\",\"knb\",\"knc\",\"knd\",\"kne\",\"knf\",\"kng\",\"kni\",\"knj\",\"knk\",\"knl\",\"knm\",\"knn\",\"kno\",\"knp\",\"knq\",\"knr\",\"kns\",\"knt\",\"knu\",\"knv\",\"knw\",\"knx\",\"kny\",\"knz\",\"koa\",\"koc\",\"kod\",\"koe\",\"kof\",\"kog\",\"koh\",\"koi\",\"koj\",\"kok\",\"kol\",\"koo\",\"kop\",\"koq\",\"kos\",\"kot\",\"kou\",\"kov\",\"kow\",\"kox\",\"koy\",\"koz\",\"kpa\",\"kpb\",\"kpc\",\"kpd\",\"kpe\",\"kpf\",\"kpg\",\"kph\",\"kpi\",\"kpj\",\"kpk\",\"kpl\",\"kpm\",\"kpn\",\"kpo\",\"kpp\",\"kpq\",\"kpr\",\"kps\",\"kpt\",\"kpu\",\"kpv\",\"kpw\",\"kpx\",\"kpy\",\"kpz\",\"kqa\",\"kqb\",\"kqc\",\"kqd\",\"kqe\",\"kqf\",\"kqg\",\"kqh\",\"kqi\",\"kqj\",\"kqk\",\"kql\",\"kqm\",\"kqn\",\"kqo\",\"kqp\",\"kqq\",\"kqr\",\"kqs\",\"kqt\",\"kqu\",\"kqv\",\"kqw\",\"kqx\",\"kqy\",\"kqz\",\"kra\",\"krb\",\"krc\",\"krd\",\"kre\",\"krf\",\"krh\",\"kri\",\"krj\",\"krk\",\"krl\",\"krm\",\"krn\",\"kro\",\"krp\",\"krr\",\"krs\",\"krt\",\"kru\",\"krv\",\"krw\",\"krx\",\"kry\",\"krz\",\"ksa\",\"ksb\",\"ksc\",\"ksd\",\"kse\",\"ksf\",\"ksg\",\"ksh\",\"ksi\",\"ksj\",\"ksk\",\"ksl\",\"ksm\",\"ksn\",\"kso\",\"ksp\",\"ksq\",\"ksr\",\"kss\",\"kst\",\"ksu\",\"ksv\",\"ksw\",\"ksx\",\"ksy\",\"ksz\",\"kta\",\"ktb\",\"ktc\",\"ktd\",\"kte\",\"ktf\",\"ktg\",\"kth\",\"kti\",\"ktj\",\"ktk\",\"ktl\",\"ktm\",\"ktn\",\"kto\",\"ktp\",\"ktq\",\"ktr\",\"kts\",\"ktt\",\"ktu\",\"ktv\",\"ktw\",\"ktx\",\"kty\",\"ktz\",\"kub\",\"kuc\",\"kud\",\"kue\",\"kuf\",\"kug\",\"kuh\",\"kui\",\"kuj\",\"kuk\",\"kul\",\"kum\",\"kun\",\"kuo\",\"kup\",\"kuq\",\"kus\",\"kut\",\"kuu\",\"kuv\",\"kuw\",\"kux\",\"kuy\",\"kuz\",\"kva\",\"kvb\",\"kvc\",\"kvd\",\"kve\",\"kvf\",\"kvg\",\"kvh\",\"kvi\",\"kvj\",\"kvk\",\"kvl\",\"kvm\",\"kvn\",\"kvo\",\"kvp\",\"kvq\",\"kvr\",\"kvs\",\"kvt\",\"kvu\",\"kvv\",\"kvw\",\"kvx\",\"kvy\",\"kvz\",\"kwa\",\"kwb\",\"kwc\",\"kwd\",\"kwe\",\"kwf\",\"kwg\",\"kwh\",\"kwi\",\"kwj\",\"kwk\",\"kwl\",\"kwm\",\"kwn\",\"kwo\",\"kwp\",\"kwq\",\"kwr\",\"kws\",\"kwt\",\"kwu\",\"kwv\",\"kww\",\"kwx\",\"kwy\",\"kwz\",\"kxa\",\"kxb\",\"kxc\",\"kxd\",\"kxe\",\"kxf\",\"kxh\",\"kxi\",\"kxj\",\"kxk\",\"kxl\",\"kxm\",\"kxn\",\"kxo\",\"kxp\",\"kxq\",\"kxr\",\"kxs\",\"kxt\",\"kxu\",\"kxv\",\"kxw\",\"kxx\",\"kxy\",\"kxz\",\"kya\",\"kyb\",\"kyc\",\"kyd\",\"kye\",\"kyf\",\"kyg\",\"kyh\",\"kyi\",\"kyj\",\"kyk\",\"kyl\",\"kym\",\"kyn\",\"kyo\",\"kyp\",\"kyq\",\"kyr\",\"kys\",\"kyt\",\"kyu\",\"kyv\",\"kyw\",\"kyx\",\"kyy\",\"kyz\",\"kza\",\"kzb\",\"kzc\",\"kzd\",\"kze\",\"kzf\",\"kzg\",\"kzh\",\"kzi\",\"kzj\",\"kzk\",\"kzl\",\"kzm\",\"kzn\",\"kzo\",\"kzp\",\"kzq\",\"kzr\",\"kzs\",\"kzt\",\"kzu\",\"kzv\",\"kzw\",\"kzx\",\"kzy\",\"kzz\",\"laa\",\"lab\",\"lac\",\"lad\",\"lae\",\"laf\",\"lag\",\"lah\",\"lai\",\"laj\",\"lak\",\"lal\",\"lam\",\"lan\",\"lap\",\"laq\",\"lar\",\"las\",\"lau\",\"law\",\"lax\",\"lay\",\"laz\",\"lba\",\"lbb\",\"lbc\",\"lbe\",\"lbf\",\"lbg\",\"lbi\",\"lbj\",\"lbk\",\"lbl\",\"lbm\",\"lbn\",\"lbo\",\"lbq\",\"lbr\",\"lbs\",\"lbt\",\"lbu\",\"lbv\",\"lbw\",\"lbx\",\"lby\",\"lbz\",\"lcc\",\"lcd\",\"lce\",\"lcf\",\"lch\",\"lcl\",\"lcm\",\"lcp\",\"lcq\",\"lcs\",\"lda\",\"ldb\",\"ldd\",\"ldg\",\"ldh\",\"ldi\",\"ldj\",\"ldk\",\"ldl\",\"ldm\",\"ldn\",\"ldo\",\"ldp\",\"ldq\",\"lea\",\"leb\",\"lec\",\"led\",\"lee\",\"lef\",\"leg\",\"leh\",\"lei\",\"lej\",\"lek\",\"lel\",\"lem\",\"len\",\"leo\",\"lep\",\"leq\",\"ler\",\"les\",\"let\",\"leu\",\"lev\",\"lew\",\"lex\",\"ley\",\"lez\",\"lfa\",\"lfn\",\"lga\",\"lgb\",\"lgg\",\"lgh\",\"lgi\",\"lgk\",\"lgl\",\"lgm\",\"lgn\",\"lgq\",\"lgr\",\"lgt\",\"lgu\",\"lgz\",\"lha\",\"lhh\",\"lhi\",\"lhl\",\"lhm\",\"lhn\",\"lhp\",\"lhs\",\"lht\",\"lhu\",\"lia\",\"lib\",\"lic\",\"lid\",\"lie\",\"lif\",\"lig\",\"lih\",\"lii\",\"lij\",\"lik\",\"lil\",\"lio\",\"lip\",\"liq\",\"lir\",\"lis\",\"liu\",\"liv\",\"liw\",\"lix\",\"liy\",\"liz\",\"lja\",\"lje\",\"lji\",\"ljl\",\"ljp\",\"ljw\",\"ljx\",\"lka\",\"lkb\",\"lkc\",\"lkd\",\"lke\",\"lkh\",\"lki\",\"lkj\",\"lkl\",\"lkm\",\"lkn\",\"lko\",\"lkr\",\"lks\",\"lkt\",\"lku\",\"lky\",\"lla\",\"llb\",\"llc\",\"lld\",\"lle\",\"llf\",\"llg\",\"llh\",\"lli\",\"llj\",\"llk\",\"lll\",\"llm\",\"lln\",\"llo\",\"llp\",\"llq\",\"lls\",\"llu\",\"llx\",\"lma\",\"lmb\",\"lmc\",\"lmd\",\"lme\",\"lmf\",\"lmg\",\"lmh\",\"lmi\",\"lmj\",\"lmk\",\"lml\",\"lmm\",\"lmn\",\"lmo\",\"lmp\",\"lmq\",\"lmr\",\"lmu\",\"lmv\",\"lmw\",\"lmx\",\"lmy\",\"lmz\",\"lna\",\"lnb\",\"lnd\",\"lng\",\"lnh\",\"lni\",\"lnj\",\"lnl\",\"lnm\",\"lnn\",\"lno\",\"lns\",\"lnu\",\"lnw\",\"lnz\",\"loa\",\"lob\",\"loc\",\"loe\",\"lof\",\"log\",\"loh\",\"loi\",\"loj\",\"lok\",\"lol\",\"lom\",\"lon\",\"loo\",\"lop\",\"loq\",\"lor\",\"los\",\"lot\",\"lou\",\"lov\",\"low\",\"lox\",\"loy\",\"loz\",\"lpa\",\"lpe\",\"lpn\",\"lpo\",\"lpx\",\"lra\",\"lrc\",\"lre\",\"lrg\",\"lri\",\"lrk\",\"lrl\",\"lrm\",\"lrn\",\"lro\",\"lrr\",\"lrt\",\"lrv\",\"lrz\",\"lsa\",\"lsd\",\"lse\",\"lsg\",\"lsh\",\"lsi\",\"lsl\",\"lsm\",\"lso\",\"lsp\",\"lsr\",\"lss\",\"lst\",\"lsy\",\"ltc\",\"ltg\",\"lth\",\"lti\",\"ltn\",\"lto\",\"lts\",\"ltu\",\"lua\",\"luc\",\"lud\",\"lue\",\"luf\",\"lui\",\"luj\",\"luk\",\"lul\",\"lum\",\"lun\",\"luo\",\"lup\",\"luq\",\"lur\",\"lus\",\"lut\",\"luu\",\"luv\",\"luw\",\"luy\",\"luz\",\"lva\",\"lvk\",\"lvs\",\"lvu\",\"lwa\",\"lwe\",\"lwg\",\"lwh\",\"lwl\",\"lwm\",\"lwo\",\"lwt\",\"lwu\",\"lww\",\"lya\",\"lyg\",\"lyn\",\"lzh\",\"lzl\",\"lzn\",\"lzz\",\"maa\",\"mab\",\"mad\",\"mae\",\"maf\",\"mag\",\"mai\",\"maj\",\"mak\",\"mam\",\"man\",\"map\",\"maq\",\"mas\",\"mat\",\"mau\",\"mav\",\"maw\",\"max\",\"maz\",\"mba\",\"mbb\",\"mbc\",\"mbd\",\"mbe\",\"mbf\",\"mbh\",\"mbi\",\"mbj\",\"mbk\",\"mbl\",\"mbm\",\"mbn\",\"mbo\",\"mbp\",\"mbq\",\"mbr\",\"mbs\",\"mbt\",\"mbu\",\"mbv\",\"mbw\",\"mbx\",\"mby\",\"mbz\",\"mca\",\"mcb\",\"mcc\",\"mcd\",\"mce\",\"mcf\",\"mcg\",\"mch\",\"mci\",\"mcj\",\"mck\",\"mcl\",\"mcm\",\"mcn\",\"mco\",\"mcp\",\"mcq\",\"mcr\",\"mcs\",\"mct\",\"mcu\",\"mcv\",\"mcw\",\"mcx\",\"mcy\",\"mcz\",\"mda\",\"mdb\",\"mdc\",\"mdd\",\"mde\",\"mdf\",\"mdg\",\"mdh\",\"mdi\",\"mdj\",\"mdk\",\"mdl\",\"mdm\",\"mdn\",\"mdp\",\"mdq\",\"mdr\",\"mds\",\"mdt\",\"mdu\",\"mdv\",\"mdw\",\"mdx\",\"mdy\",\"mdz\",\"mea\",\"meb\",\"mec\",\"med\",\"mee\",\"mef\",\"meg\",\"meh\",\"mei\",\"mej\",\"mek\",\"mel\",\"mem\",\"men\",\"meo\",\"mep\",\"meq\",\"mer\",\"mes\",\"met\",\"meu\",\"mev\",\"mew\",\"mey\",\"mez\",\"mfa\",\"mfb\",\"mfc\",\"mfd\",\"mfe\",\"mff\",\"mfg\",\"mfh\",\"mfi\",\"mfj\",\"mfk\",\"mfl\",\"mfm\",\"mfn\",\"mfo\",\"mfp\",\"mfq\",\"mfr\",\"mfs\",\"mft\",\"mfu\",\"mfv\",\"mfw\",\"mfx\",\"mfy\",\"mfz\",\"mga\",\"mgb\",\"mgc\",\"mgd\",\"mge\",\"mgf\",\"mgg\",\"mgh\",\"mgi\",\"mgj\",\"mgk\",\"mgl\",\"mgm\",\"mgn\",\"mgo\",\"mgp\",\"mgq\",\"mgr\",\"mgs\",\"mgt\",\"mgu\",\"mgv\",\"mgw\",\"mgx\",\"mgy\",\"mgz\",\"mha\",\"mhb\",\"mhc\",\"mhd\",\"mhe\",\"mhf\",\"mhg\",\"mhh\",\"mhi\",\"mhj\",\"mhk\",\"mhl\",\"mhm\",\"mhn\",\"mho\",\"mhp\",\"mhq\",\"mhr\",\"mhs\",\"mht\",\"mhu\",\"mhw\",\"mhx\",\"mhy\",\"mhz\",\"mia\",\"mib\",\"mic\",\"mid\",\"mie\",\"mif\",\"mig\",\"mih\",\"mii\",\"mij\",\"mik\",\"mil\",\"mim\",\"min\",\"mio\",\"mip\",\"miq\",\"mir\",\"mis\",\"mit\",\"miu\",\"miw\",\"mix\",\"miy\",\"miz\",\"mja\",\"mjb\",\"mjc\",\"mjd\",\"mje\",\"mjg\",\"mjh\",\"mji\",\"mjj\",\"mjk\",\"mjl\",\"mjm\",\"mjn\",\"mjo\",\"mjp\",\"mjq\",\"mjr\",\"mjs\",\"mjt\",\"mju\",\"mjv\",\"mjw\",\"mjx\",\"mjy\",\"mjz\",\"mka\",\"mkb\",\"mkc\",\"mke\",\"mkf\",\"mkg\",\"mkh\",\"mki\",\"mkj\",\"mkk\",\"mkl\",\"mkm\",\"mkn\",\"mko\",\"mkp\",\"mkq\",\"mkr\",\"mks\",\"mkt\",\"mku\",\"mkv\",\"mkw\",\"mkx\",\"mky\",\"mkz\",\"mla\",\"mlb\",\"mlc\",\"mld\",\"mle\",\"mlf\",\"mlh\",\"mli\",\"mlj\",\"mlk\",\"mll\",\"mlm\",\"mln\",\"mlo\",\"mlp\",\"mlq\",\"mlr\",\"mls\",\"mlu\",\"mlv\",\"mlw\",\"mlx\",\"mlz\",\"mma\",\"mmb\",\"mmc\",\"mmd\",\"mme\",\"mmf\",\"mmg\",\"mmh\",\"mmi\",\"mmj\",\"mmk\",\"mml\",\"mmm\",\"mmn\",\"mmo\",\"mmp\",\"mmq\",\"mmr\",\"mmt\",\"mmu\",\"mmv\",\"mmw\",\"mmx\",\"mmy\",\"mmz\",\"mna\",\"mnb\",\"mnc\",\"mnd\",\"mne\",\"mnf\",\"mng\",\"mnh\",\"mni\",\"mnj\",\"mnk\",\"mnl\",\"mnm\",\"mnn\",\"mno\",\"mnp\",\"mnq\",\"mnr\",\"mns\",\"mnt\",\"mnu\",\"mnv\",\"mnw\",\"mnx\",\"mny\",\"mnz\",\"moa\",\"moc\",\"mod\",\"moe\",\"mof\",\"mog\",\"moh\",\"moi\",\"moj\",\"mok\",\"mom\",\"moo\",\"mop\",\"moq\",\"mor\",\"mos\",\"mot\",\"mou\",\"mov\",\"mow\",\"mox\",\"moy\",\"moz\",\"mpa\",\"mpb\",\"mpc\",\"mpd\",\"mpe\",\"mpg\",\"mph\",\"mpi\",\"mpj\",\"mpk\",\"mpl\",\"mpm\",\"mpn\",\"mpo\",\"mpp\",\"mpq\",\"mpr\",\"mps\",\"mpt\",\"mpu\",\"mpv\",\"mpw\",\"mpx\",\"mpy\",\"mpz\",\"mqa\",\"mqb\",\"mqc\",\"mqe\",\"mqf\",\"mqg\",\"mqh\",\"mqi\",\"mqj\",\"mqk\",\"mql\",\"mqm\",\"mqn\",\"mqo\",\"mqp\",\"mqq\",\"mqr\",\"mqs\",\"mqt\",\"mqu\",\"mqv\",\"mqw\",\"mqx\",\"mqy\",\"mqz\",\"mra\",\"mrb\",\"mrc\",\"mrd\",\"mre\",\"mrf\",\"mrg\",\"mrh\",\"mrj\",\"mrk\",\"mrl\",\"mrm\",\"mrn\",\"mro\",\"mrp\",\"mrq\",\"mrr\",\"mrs\",\"mrt\",\"mru\",\"mrv\",\"mrw\",\"mrx\",\"mry\",\"mrz\",\"msb\",\"msc\",\"msd\",\"mse\",\"msf\",\"msg\",\"msh\",\"msi\",\"msj\",\"msk\",\"msl\",\"msm\",\"msn\",\"mso\",\"msp\",\"msq\",\"msr\",\"mss\",\"mst\",\"msu\",\"msv\",\"msw\",\"msx\",\"msy\",\"msz\",\"mta\",\"mtb\",\"mtc\",\"mtd\",\"mte\",\"mtf\",\"mtg\",\"mth\",\"mti\",\"mtj\",\"mtk\",\"mtl\",\"mtm\",\"mtn\",\"mto\",\"mtp\",\"mtq\",\"mtr\",\"mts\",\"mtt\",\"mtu\",\"mtv\",\"mtw\",\"mtx\",\"mty\",\"mua\",\"mub\",\"muc\",\"mud\",\"mue\",\"mug\",\"muh\",\"mui\",\"muj\",\"muk\",\"mul\",\"mum\",\"mun\",\"muo\",\"mup\",\"muq\",\"mur\",\"mus\",\"mut\",\"muu\",\"muv\",\"mux\",\"muy\",\"muz\",\"mva\",\"mvb\",\"mvd\",\"mve\",\"mvf\",\"mvg\",\"mvh\",\"mvi\",\"mvk\",\"mvl\",\"mvm\",\"mvn\",\"mvo\",\"mvp\",\"mvq\",\"mvr\",\"mvs\",\"mvt\",\"mvu\",\"mvv\",\"mvw\",\"mvx\",\"mvy\",\"mvz\",\"mwa\",\"mwb\",\"mwc\",\"mwd\",\"mwe\",\"mwf\",\"mwg\",\"mwh\",\"mwi\",\"mwj\",\"mwk\",\"mwl\",\"mwm\",\"mwn\",\"mwo\",\"mwp\",\"mwq\",\"mwr\",\"mws\",\"mwt\",\"mwu\",\"mwv\",\"mww\",\"mwx\",\"mwy\",\"mwz\",\"mxa\",\"mxb\",\"mxc\",\"mxd\",\"mxe\",\"mxf\",\"mxg\",\"mxh\",\"mxi\",\"mxj\",\"mxk\",\"mxl\",\"mxm\",\"mxn\",\"mxo\",\"mxp\",\"mxq\",\"mxr\",\"mxs\",\"mxt\",\"mxu\",\"mxv\",\"mxw\",\"mxx\",\"mxy\",\"mxz\",\"myb\",\"myc\",\"myd\",\"mye\",\"myf\",\"myg\",\"myh\",\"myi\",\"myj\",\"myk\",\"myl\",\"mym\",\"myn\",\"myo\",\"myp\",\"myq\",\"myr\",\"mys\",\"myt\",\"myu\",\"myv\",\"myw\",\"myx\",\"myy\",\"myz\",\"mza\",\"mzb\",\"mzc\",\"mzd\",\"mze\",\"mzg\",\"mzh\",\"mzi\",\"mzj\",\"mzk\",\"mzl\",\"mzm\",\"mzn\",\"mzo\",\"mzp\",\"mzq\",\"mzr\",\"mzs\",\"mzt\",\"mzu\",\"mzv\",\"mzw\",\"mzx\",\"mzy\",\"mzz\",\"naa\",\"nab\",\"nac\",\"nad\",\"nae\",\"naf\",\"nag\",\"nah\",\"nai\",\"naj\",\"nak\",\"nal\",\"nam\",\"nan\",\"nao\",\"nap\",\"naq\",\"nar\",\"nas\",\"nat\",\"naw\",\"nax\",\"nay\",\"naz\",\"nba\",\"nbb\",\"nbc\",\"nbd\",\"nbe\",\"nbf\",\"nbg\",\"nbh\",\"nbi\",\"nbj\",\"nbk\",\"nbm\",\"nbn\",\"nbo\",\"nbp\",\"nbq\",\"nbr\",\"nbs\",\"nbt\",\"nbu\",\"nbv\",\"nbw\",\"nbx\",\"nby\",\"nca\",\"ncb\",\"ncc\",\"ncd\",\"nce\",\"ncf\",\"ncg\",\"nch\",\"nci\",\"ncj\",\"nck\",\"ncl\",\"ncm\",\"ncn\",\"nco\",\"ncp\",\"ncq\",\"ncr\",\"ncs\",\"nct\",\"ncu\",\"ncx\",\"ncz\",\"nda\",\"ndb\",\"ndc\",\"ndd\",\"ndf\",\"ndg\",\"ndh\",\"ndi\",\"ndj\",\"ndk\",\"ndl\",\"ndm\",\"ndn\",\"ndp\",\"ndq\",\"ndr\",\"nds\",\"ndt\",\"ndu\",\"ndv\",\"ndw\",\"ndx\",\"ndy\",\"ndz\",\"nea\",\"neb\",\"nec\",\"ned\",\"nee\",\"nef\",\"neg\",\"neh\",\"nei\",\"nej\",\"nek\",\"nem\",\"nen\",\"neo\",\"neq\",\"ner\",\"nes\",\"net\",\"neu\",\"nev\",\"new\",\"nex\",\"ney\",\"nez\",\"nfa\",\"nfd\",\"nfl\",\"nfr\",\"nfu\",\"nga\",\"ngb\",\"ngc\",\"ngd\",\"nge\",\"ngf\",\"ngg\",\"ngh\",\"ngi\",\"ngj\",\"ngk\",\"ngl\",\"ngm\",\"ngn\",\"ngo\",\"ngp\",\"ngq\",\"ngr\",\"ngs\",\"ngt\",\"ngu\",\"ngv\",\"ngw\",\"ngx\",\"ngy\",\"ngz\",\"nha\",\"nhb\",\"nhc\",\"nhd\",\"nhe\",\"nhf\",\"nhg\",\"nhh\",\"nhi\",\"nhk\",\"nhm\",\"nhn\",\"nho\",\"nhp\",\"nhq\",\"nhr\",\"nht\",\"nhu\",\"nhv\",\"nhw\",\"nhx\",\"nhy\",\"nhz\",\"nia\",\"nib\",\"nic\",\"nid\",\"nie\",\"nif\",\"nig\",\"nih\",\"nii\",\"nij\",\"nik\",\"nil\",\"nim\",\"nin\",\"nio\",\"niq\",\"nir\",\"nis\",\"nit\",\"niu\",\"niv\",\"niw\",\"nix\",\"niy\",\"niz\",\"nja\",\"njb\",\"njd\",\"njh\",\"nji\",\"njj\",\"njl\",\"njm\",\"njn\",\"njo\",\"njr\",\"njs\",\"njt\",\"nju\",\"njx\",\"njy\",\"njz\",\"nka\",\"nkb\",\"nkc\",\"nkd\",\"nke\",\"nkf\",\"nkg\",\"nkh\",\"nki\",\"nkj\",\"nkk\",\"nkm\",\"nkn\",\"nko\",\"nkp\",\"nkq\",\"nkr\",\"nks\",\"nkt\",\"nku\",\"nkv\",\"nkw\",\"nkx\",\"nkz\",\"nla\",\"nlc\",\"nle\",\"nlg\",\"nli\",\"nlj\",\"nlk\",\"nll\",\"nln\",\"nlo\",\"nlq\",\"nlr\",\"nlu\",\"nlv\",\"nlw\",\"nlx\",\"nly\",\"nlz\",\"nma\",\"nmb\",\"nmc\",\"nmd\",\"nme\",\"nmf\",\"nmg\",\"nmh\",\"nmi\",\"nmj\",\"nmk\",\"nml\",\"nmm\",\"nmn\",\"nmo\",\"nmp\",\"nmq\",\"nmr\",\"nms\",\"nmt\",\"nmu\",\"nmv\",\"nmw\",\"nmx\",\"nmy\",\"nmz\",\"nna\",\"nnb\",\"nnc\",\"nnd\",\"nne\",\"nnf\",\"nng\",\"nnh\",\"nni\",\"nnj\",\"nnk\",\"nnl\",\"nnm\",\"nnn\",\"nnp\",\"nnq\",\"nnr\",\"nns\",\"nnt\",\"nnu\",\"nnv\",\"nnw\",\"nnx\",\"nny\",\"nnz\",\"noa\",\"noc\",\"nod\",\"noe\",\"nof\",\"nog\",\"noh\",\"noi\",\"noj\",\"nok\",\"nol\",\"nom\",\"non\",\"noo\",\"nop\",\"noq\",\"nos\",\"not\",\"nou\",\"nov\",\"now\",\"noy\",\"noz\",\"npa\",\"npb\",\"npg\",\"nph\",\"npi\",\"npl\",\"npn\",\"npo\",\"nps\",\"npu\",\"npx\",\"npy\",\"nqg\",\"nqk\",\"nql\",\"nqm\",\"nqn\",\"nqo\",\"nqq\",\"nqy\",\"nra\",\"nrb\",\"nrc\",\"nre\",\"nrf\",\"nrg\",\"nri\",\"nrk\",\"nrl\",\"nrm\",\"nrn\",\"nrp\",\"nrr\",\"nrt\",\"nru\",\"nrx\",\"nrz\",\"nsa\",\"nsc\",\"nsd\",\"nse\",\"nsf\",\"nsg\",\"nsh\",\"nsi\",\"nsk\",\"nsl\",\"nsm\",\"nsn\",\"nso\",\"nsp\",\"nsq\",\"nsr\",\"nss\",\"nst\",\"nsu\",\"nsv\",\"nsw\",\"nsx\",\"nsy\",\"nsz\",\"ntd\",\"nte\",\"ntg\",\"nti\",\"ntj\",\"ntk\",\"ntm\",\"nto\",\"ntp\",\"ntr\",\"nts\",\"ntu\",\"ntw\",\"ntx\",\"nty\",\"ntz\",\"nua\",\"nub\",\"nuc\",\"nud\",\"nue\",\"nuf\",\"nug\",\"nuh\",\"nui\",\"nuj\",\"nuk\",\"nul\",\"num\",\"nun\",\"nuo\",\"nup\",\"nuq\",\"nur\",\"nus\",\"nut\",\"nuu\",\"nuv\",\"nuw\",\"nux\",\"nuy\",\"nuz\",\"nvh\",\"nvm\",\"nvo\",\"nwa\",\"nwb\",\"nwc\",\"nwe\",\"nwg\",\"nwi\",\"nwm\",\"nwo\",\"nwr\",\"nwx\",\"nwy\",\"nxa\",\"nxd\",\"nxe\",\"nxg\",\"nxi\",\"nxk\",\"nxl\",\"nxm\",\"nxn\",\"nxo\",\"nxq\",\"nxr\",\"nxu\",\"nxx\",\"nyb\",\"nyc\",\"nyd\",\"nye\",\"nyf\",\"nyg\",\"nyh\",\"nyi\",\"nyj\",\"nyk\",\"nyl\",\"nym\",\"nyn\",\"nyo\",\"nyp\",\"nyq\",\"nyr\",\"nys\",\"nyt\",\"nyu\",\"nyv\",\"nyw\",\"nyx\",\"nyy\",\"nza\",\"nzb\",\"nzi\",\"nzk\",\"nzm\",\"nzs\",\"nzu\",\"nzy\",\"nzz\",\"oaa\",\"oac\",\"oar\",\"oav\",\"obi\",\"obk\",\"obl\",\"obm\",\"obo\",\"obr\",\"obt\",\"obu\",\"oca\",\"och\",\"oco\",\"ocu\",\"oda\",\"odk\",\"odt\",\"odu\",\"ofo\",\"ofs\",\"ofu\",\"ogb\",\"ogc\",\"oge\",\"ogg\",\"ogo\",\"ogu\",\"oht\",\"ohu\",\"oia\",\"oin\",\"ojb\",\"ojc\",\"ojg\",\"ojp\",\"ojs\",\"ojv\",\"ojw\",\"oka\",\"okb\",\"okd\",\"oke\",\"okg\",\"okh\",\"oki\",\"okj\",\"okk\",\"okl\",\"okm\",\"okn\",\"oko\",\"okr\",\"oks\",\"oku\",\"okv\",\"okx\",\"ola\",\"old\",\"ole\",\"olk\",\"olm\",\"olo\",\"olr\",\"olt\",\"olu\",\"oma\",\"omb\",\"omc\",\"ome\",\"omg\",\"omi\",\"omk\",\"oml\",\"omn\",\"omo\",\"omp\",\"omq\",\"omr\",\"omt\",\"omu\",\"omv\",\"omw\",\"omx\",\"ona\",\"onb\",\"one\",\"ong\",\"oni\",\"onj\",\"onk\",\"onn\",\"ono\",\"onp\",\"onr\",\"ons\",\"ont\",\"onu\",\"onw\",\"onx\",\"ood\",\"oog\",\"oon\",\"oor\",\"oos\",\"opa\",\"opk\",\"opm\",\"opo\",\"opt\",\"opy\",\"ora\",\"orc\",\"ore\",\"org\",\"orh\",\"orn\",\"oro\",\"orr\",\"ors\",\"ort\",\"oru\",\"orv\",\"orw\",\"orx\",\"ory\",\"orz\",\"osa\",\"osc\",\"osi\",\"oso\",\"osp\",\"ost\",\"osu\",\"osx\",\"ota\",\"otb\",\"otd\",\"ote\",\"oti\",\"otk\",\"otl\",\"otm\",\"otn\",\"oto\",\"otq\",\"otr\",\"ots\",\"ott\",\"otu\",\"otw\",\"otx\",\"oty\",\"otz\",\"oua\",\"oub\",\"oue\",\"oui\",\"oum\",\"oun\",\"ovd\",\"owi\",\"owl\",\"oyb\",\"oyd\",\"oym\",\"oyy\",\"ozm\",\"paa\",\"pab\",\"pac\",\"pad\",\"pae\",\"paf\",\"pag\",\"pah\",\"pai\",\"pak\",\"pal\",\"pam\",\"pao\",\"pap\",\"paq\",\"par\",\"pas\",\"pat\",\"pau\",\"pav\",\"paw\",\"pax\",\"pay\",\"paz\",\"pbb\",\"pbc\",\"pbe\",\"pbf\",\"pbg\",\"pbh\",\"pbi\",\"pbl\",\"pbn\",\"pbo\",\"pbp\",\"pbr\",\"pbs\",\"pbt\",\"pbu\",\"pbv\",\"pby\",\"pbz\",\"pca\",\"pcb\",\"pcc\",\"pcd\",\"pce\",\"pcf\",\"pcg\",\"pch\",\"pci\",\"pcj\",\"pck\",\"pcl\",\"pcm\",\"pcn\",\"pcp\",\"pcr\",\"pcw\",\"pda\",\"pdc\",\"pdi\",\"pdn\",\"pdo\",\"pdt\",\"pdu\",\"pea\",\"peb\",\"ped\",\"pee\",\"pef\",\"peg\",\"peh\",\"pei\",\"pej\",\"pek\",\"pel\",\"pem\",\"peo\",\"pep\",\"peq\",\"pes\",\"pev\",\"pex\",\"pey\",\"pez\",\"pfa\",\"pfe\",\"pfl\",\"pga\",\"pgd\",\"pgg\",\"pgi\",\"pgk\",\"pgl\",\"pgn\",\"pgs\",\"pgu\",\"pgy\",\"pgz\",\"pha\",\"phd\",\"phg\",\"phh\",\"phi\",\"phk\",\"phl\",\"phm\",\"phn\",\"pho\",\"phq\",\"phr\",\"pht\",\"phu\",\"phv\",\"phw\",\"pia\",\"pib\",\"pic\",\"pid\",\"pie\",\"pif\",\"pig\",\"pih\",\"pii\",\"pij\",\"pil\",\"pim\",\"pin\",\"pio\",\"pip\",\"pir\",\"pis\",\"pit\",\"piu\",\"piv\",\"piw\",\"pix\",\"piy\",\"piz\",\"pjt\",\"pka\",\"pkb\",\"pkc\",\"pkg\",\"pkh\",\"pkn\",\"pko\",\"pkp\",\"pkr\",\"pks\",\"pkt\",\"pku\",\"pla\",\"plb\",\"plc\",\"pld\",\"ple\",\"plf\",\"plg\",\"plh\",\"plj\",\"plk\",\"pll\",\"pln\",\"plo\",\"plp\",\"plq\",\"plr\",\"pls\",\"plt\",\"plu\",\"plv\",\"plw\",\"ply\",\"plz\",\"pma\",\"pmb\",\"pmc\",\"pmd\",\"pme\",\"pmf\",\"pmh\",\"pmi\",\"pmj\",\"pmk\",\"pml\",\"pmm\",\"pmn\",\"pmo\",\"pmq\",\"pmr\",\"pms\",\"pmt\",\"pmu\",\"pmw\",\"pmx\",\"pmy\",\"pmz\",\"pna\",\"pnb\",\"pnc\",\"pne\",\"png\",\"pnh\",\"pni\",\"pnj\",\"pnk\",\"pnl\",\"pnm\",\"pnn\",\"pno\",\"pnp\",\"pnq\",\"pnr\",\"pns\",\"pnt\",\"pnu\",\"pnv\",\"pnw\",\"pnx\",\"pny\",\"pnz\",\"poc\",\"pod\",\"poe\",\"pof\",\"pog\",\"poh\",\"poi\",\"pok\",\"pom\",\"pon\",\"poo\",\"pop\",\"poq\",\"pos\",\"pot\",\"pov\",\"pow\",\"pox\",\"poy\",\"poz\",\"ppa\",\"ppe\",\"ppi\",\"ppk\",\"ppl\",\"ppm\",\"ppn\",\"ppo\",\"ppp\",\"ppq\",\"ppr\",\"pps\",\"ppt\",\"ppu\",\"pqa\",\"pqe\",\"pqm\",\"pqw\",\"pra\",\"prb\",\"prc\",\"prd\",\"pre\",\"prf\",\"prg\",\"prh\",\"pri\",\"prk\",\"prl\",\"prm\",\"prn\",\"pro\",\"prp\",\"prq\",\"prr\",\"prs\",\"prt\",\"pru\",\"prw\",\"prx\",\"pry\",\"prz\",\"psa\",\"psc\",\"psd\",\"pse\",\"psg\",\"psh\",\"psi\",\"psl\",\"psm\",\"psn\",\"pso\",\"psp\",\"psq\",\"psr\",\"pss\",\"pst\",\"psu\",\"psw\",\"psy\",\"pta\",\"pth\",\"pti\",\"ptn\",\"pto\",\"ptp\",\"ptq\",\"ptr\",\"ptt\",\"ptu\",\"ptv\",\"ptw\",\"pty\",\"pua\",\"pub\",\"puc\",\"pud\",\"pue\",\"puf\",\"pug\",\"pui\",\"puj\",\"puk\",\"pum\",\"puo\",\"pup\",\"puq\",\"pur\",\"put\",\"puu\",\"puw\",\"pux\",\"puy\",\"puz\",\"pwa\",\"pwb\",\"pwg\",\"pwi\",\"pwm\",\"pwn\",\"pwo\",\"pwr\",\"pww\",\"pxm\",\"pye\",\"pym\",\"pyn\",\"pys\",\"pyu\",\"pyx\",\"pyy\",\"pzn\",\"qaa..qtz\",\"qua\",\"qub\",\"quc\",\"qud\",\"quf\",\"qug\",\"quh\",\"qui\",\"quk\",\"qul\",\"qum\",\"qun\",\"qup\",\"quq\",\"qur\",\"qus\",\"quv\",\"quw\",\"qux\",\"quy\",\"quz\",\"qva\",\"qvc\",\"qve\",\"qvh\",\"qvi\",\"qvj\",\"qvl\",\"qvm\",\"qvn\",\"qvo\",\"qvp\",\"qvs\",\"qvw\",\"qvy\",\"qvz\",\"qwa\",\"qwc\",\"qwe\",\"qwh\",\"qwm\",\"qws\",\"qwt\",\"qxa\",\"qxc\",\"qxh\",\"qxl\",\"qxn\",\"qxo\",\"qxp\",\"qxq\",\"qxr\",\"qxs\",\"qxt\",\"qxu\",\"qxw\",\"qya\",\"qyp\",\"raa\",\"rab\",\"rac\",\"rad\",\"raf\",\"rag\",\"rah\",\"rai\",\"raj\",\"rak\",\"ral\",\"ram\",\"ran\",\"rao\",\"rap\",\"raq\",\"rar\",\"ras\",\"rat\",\"rau\",\"rav\",\"raw\",\"rax\",\"ray\",\"raz\",\"rbb\",\"rbk\",\"rbl\",\"rbp\",\"rcf\",\"rdb\",\"rea\",\"reb\",\"ree\",\"reg\",\"rei\",\"rej\",\"rel\",\"rem\",\"ren\",\"rer\",\"res\",\"ret\",\"rey\",\"rga\",\"rge\",\"rgk\",\"rgn\",\"rgr\",\"rgs\",\"rgu\",\"rhg\",\"rhp\",\"ria\",\"rie\",\"rif\",\"ril\",\"rim\",\"rin\",\"rir\",\"rit\",\"riu\",\"rjg\",\"rji\",\"rjs\",\"rka\",\"rkb\",\"rkh\",\"rki\",\"rkm\",\"rkt\",\"rkw\",\"rma\",\"rmb\",\"rmc\",\"rmd\",\"rme\",\"rmf\",\"rmg\",\"rmh\",\"rmi\",\"rmk\",\"rml\",\"rmm\",\"rmn\",\"rmo\",\"rmp\",\"rmq\",\"rmr\",\"rms\",\"rmt\",\"rmu\",\"rmv\",\"rmw\",\"rmx\",\"rmy\",\"rmz\",\"rna\",\"rnd\",\"rng\",\"rnl\",\"rnn\",\"rnp\",\"rnr\",\"rnw\",\"roa\",\"rob\",\"roc\",\"rod\",\"roe\",\"rof\",\"rog\",\"rol\",\"rom\",\"roo\",\"rop\",\"ror\",\"rou\",\"row\",\"rpn\",\"rpt\",\"rri\",\"rro\",\"rrt\",\"rsb\",\"rsi\",\"rsl\",\"rsm\",\"rtc\",\"rth\",\"rtm\",\"rts\",\"rtw\",\"rub\",\"ruc\",\"rue\",\"ruf\",\"rug\",\"ruh\",\"rui\",\"ruk\",\"ruo\",\"rup\",\"ruq\",\"rut\",\"ruu\",\"ruy\",\"ruz\",\"rwa\",\"rwk\",\"rwm\",\"rwo\",\"rwr\",\"rxd\",\"rxw\",\"ryn\",\"rys\",\"ryu\",\"rzh\",\"saa\",\"sab\",\"sac\",\"sad\",\"sae\",\"saf\",\"sah\",\"sai\",\"saj\",\"sak\",\"sal\",\"sam\",\"sao\",\"sap\",\"saq\",\"sar\",\"sas\",\"sat\",\"sau\",\"sav\",\"saw\",\"sax\",\"say\",\"saz\",\"sba\",\"sbb\",\"sbc\",\"sbd\",\"sbe\",\"sbf\",\"sbg\",\"sbh\",\"sbi\",\"sbj\",\"sbk\",\"sbl\",\"sbm\",\"sbn\",\"sbo\",\"sbp\",\"sbq\",\"sbr\",\"sbs\",\"sbt\",\"sbu\",\"sbv\",\"sbw\",\"sbx\",\"sby\",\"sbz\",\"sca\",\"scb\",\"sce\",\"scf\",\"scg\",\"sch\",\"sci\",\"sck\",\"scl\",\"scn\",\"sco\",\"scp\",\"scq\",\"scs\",\"sct\",\"scu\",\"scv\",\"scw\",\"scx\",\"sda\",\"sdb\",\"sdc\",\"sde\",\"sdf\",\"sdg\",\"sdh\",\"sdj\",\"sdk\",\"sdl\",\"sdm\",\"sdn\",\"sdo\",\"sdp\",\"sdr\",\"sds\",\"sdt\",\"sdu\",\"sdv\",\"sdx\",\"sdz\",\"sea\",\"seb\",\"sec\",\"sed\",\"see\",\"sef\",\"seg\",\"seh\",\"sei\",\"sej\",\"sek\",\"sel\",\"sem\",\"sen\",\"seo\",\"sep\",\"seq\",\"ser\",\"ses\",\"set\",\"seu\",\"sev\",\"sew\",\"sey\",\"sez\",\"sfb\",\"sfe\",\"sfm\",\"sfs\",\"sfw\",\"sga\",\"sgb\",\"sgc\",\"sgd\",\"sge\",\"sgg\",\"sgh\",\"sgi\",\"sgj\",\"sgk\",\"sgl\",\"sgm\",\"sgn\",\"sgo\",\"sgp\",\"sgr\",\"sgs\",\"sgt\",\"sgu\",\"sgw\",\"sgx\",\"sgy\",\"sgz\",\"sha\",\"shb\",\"shc\",\"shd\",\"she\",\"shg\",\"shh\",\"shi\",\"shj\",\"shk\",\"shl\",\"shm\",\"shn\",\"sho\",\"shp\",\"shq\",\"shr\",\"shs\",\"sht\",\"shu\",\"shv\",\"shw\",\"shx\",\"shy\",\"shz\",\"sia\",\"sib\",\"sid\",\"sie\",\"sif\",\"sig\",\"sih\",\"sii\",\"sij\",\"sik\",\"sil\",\"sim\",\"sio\",\"sip\",\"siq\",\"sir\",\"sis\",\"sit\",\"siu\",\"siv\",\"siw\",\"six\",\"siy\",\"siz\",\"sja\",\"sjb\",\"sjd\",\"sje\",\"sjg\",\"sjk\",\"sjl\",\"sjm\",\"sjn\",\"sjo\",\"sjp\",\"sjr\",\"sjs\",\"sjt\",\"sju\",\"sjw\",\"ska\",\"skb\",\"skc\",\"skd\",\"ske\",\"skf\",\"skg\",\"skh\",\"ski\",\"skj\",\"skk\",\"skm\",\"skn\",\"sko\",\"skp\",\"skq\",\"skr\",\"sks\",\"skt\",\"sku\",\"skv\",\"skw\",\"skx\",\"sky\",\"skz\",\"sla\",\"slc\",\"sld\",\"sle\",\"slf\",\"slg\",\"slh\",\"sli\",\"slj\",\"sll\",\"slm\",\"sln\",\"slp\",\"slq\",\"slr\",\"sls\",\"slt\",\"slu\",\"slw\",\"slx\",\"sly\",\"slz\",\"sma\",\"smb\",\"smc\",\"smd\",\"smf\",\"smg\",\"smh\",\"smi\",\"smj\",\"smk\",\"sml\",\"smm\",\"smn\",\"smp\",\"smq\",\"smr\",\"sms\",\"smt\",\"smu\",\"smv\",\"smw\",\"smx\",\"smy\",\"smz\",\"snb\",\"snc\",\"sne\",\"snf\",\"sng\",\"snh\",\"sni\",\"snj\",\"snk\",\"snl\",\"snm\",\"snn\",\"sno\",\"snp\",\"snq\",\"snr\",\"sns\",\"snu\",\"snv\",\"snw\",\"snx\",\"sny\",\"snz\",\"soa\",\"sob\",\"soc\",\"sod\",\"soe\",\"sog\",\"soh\",\"soi\",\"soj\",\"sok\",\"sol\",\"son\",\"soo\",\"sop\",\"soq\",\"sor\",\"sos\",\"sou\",\"sov\",\"sow\",\"sox\",\"soy\",\"soz\",\"spb\",\"spc\",\"spd\",\"spe\",\"spg\",\"spi\",\"spk\",\"spl\",\"spm\",\"spn\",\"spo\",\"spp\",\"spq\",\"spr\",\"sps\",\"spt\",\"spu\",\"spv\",\"spx\",\"spy\",\"sqa\",\"sqh\",\"sqj\",\"sqk\",\"sqm\",\"sqn\",\"sqo\",\"sqq\",\"sqr\",\"sqs\",\"sqt\",\"squ\",\"sra\",\"srb\",\"src\",\"sre\",\"srf\",\"srg\",\"srh\",\"sri\",\"srk\",\"srl\",\"srm\",\"srn\",\"sro\",\"srq\",\"srr\",\"srs\",\"srt\",\"sru\",\"srv\",\"srw\",\"srx\",\"sry\",\"srz\",\"ssa\",\"ssb\",\"ssc\",\"ssd\",\"sse\",\"ssf\",\"ssg\",\"ssh\",\"ssi\",\"ssj\",\"ssk\",\"ssl\",\"ssm\",\"ssn\",\"sso\",\"ssp\",\"ssq\",\"ssr\",\"sss\",\"sst\",\"ssu\",\"ssv\",\"ssx\",\"ssy\",\"ssz\",\"sta\",\"stb\",\"std\",\"ste\",\"stf\",\"stg\",\"sth\",\"sti\",\"stj\",\"stk\",\"stl\",\"stm\",\"stn\",\"sto\",\"stp\",\"stq\",\"str\",\"sts\",\"stt\",\"stu\",\"stv\",\"stw\",\"sty\",\"sua\",\"sub\",\"suc\",\"sue\",\"sug\",\"sui\",\"suj\",\"suk\",\"sul\",\"sum\",\"suq\",\"sur\",\"sus\",\"sut\",\"suv\",\"suw\",\"sux\",\"suy\",\"suz\",\"sva\",\"svb\",\"svc\",\"sve\",\"svk\",\"svm\",\"svr\",\"svs\",\"svx\",\"swb\",\"swc\",\"swf\",\"swg\",\"swh\",\"swi\",\"swj\",\"swk\",\"swl\",\"swm\",\"swn\",\"swo\",\"swp\",\"swq\",\"swr\",\"sws\",\"swt\",\"swu\",\"swv\",\"sww\",\"swx\",\"swy\",\"sxb\",\"sxc\",\"sxe\",\"sxg\",\"sxk\",\"sxl\",\"sxm\",\"sxn\",\"sxo\",\"sxr\",\"sxs\",\"sxu\",\"sxw\",\"sya\",\"syb\",\"syc\",\"syd\",\"syi\",\"syk\",\"syl\",\"sym\",\"syn\",\"syo\",\"syr\",\"sys\",\"syw\",\"syx\",\"syy\",\"sza\",\"szb\",\"szc\",\"szd\",\"sze\",\"szg\",\"szl\",\"szn\",\"szp\",\"szs\",\"szv\",\"szw\",\"taa\",\"tab\",\"tac\",\"tad\",\"tae\",\"taf\",\"tag\",\"tai\",\"taj\",\"tak\",\"tal\",\"tan\",\"tao\",\"tap\",\"taq\",\"tar\",\"tas\",\"tau\",\"tav\",\"taw\",\"tax\",\"tay\",\"taz\",\"tba\",\"tbb\",\"tbc\",\"tbd\",\"tbe\",\"tbf\",\"tbg\",\"tbh\",\"tbi\",\"tbj\",\"tbk\",\"tbl\",\"tbm\",\"tbn\",\"tbo\",\"tbp\",\"tbq\",\"tbr\",\"tbs\",\"tbt\",\"tbu\",\"tbv\",\"tbw\",\"tbx\",\"tby\",\"tbz\",\"tca\",\"tcb\",\"tcc\",\"tcd\",\"tce\",\"tcf\",\"tcg\",\"tch\",\"tci\",\"tck\",\"tcl\",\"tcm\",\"tcn\",\"tco\",\"tcp\",\"tcq\",\"tcs\",\"tct\",\"tcu\",\"tcw\",\"tcx\",\"tcy\",\"tcz\",\"tda\",\"tdb\",\"tdc\",\"tdd\",\"tde\",\"tdf\",\"tdg\",\"tdh\",\"tdi\",\"tdj\",\"tdk\",\"tdl\",\"tdm\",\"tdn\",\"tdo\",\"tdq\",\"tdr\",\"tds\",\"tdt\",\"tdu\",\"tdv\",\"tdx\",\"tdy\",\"tea\",\"teb\",\"tec\",\"ted\",\"tee\",\"tef\",\"teg\",\"teh\",\"tei\",\"tek\",\"tem\",\"ten\",\"teo\",\"tep\",\"teq\",\"ter\",\"tes\",\"tet\",\"teu\",\"tev\",\"tew\",\"tex\",\"tey\",\"tfi\",\"tfn\",\"tfo\",\"tfr\",\"tft\",\"tga\",\"tgb\",\"tgc\",\"tgd\",\"tge\",\"tgf\",\"tgg\",\"tgh\",\"tgi\",\"tgj\",\"tgn\",\"tgo\",\"tgp\",\"tgq\",\"tgr\",\"tgs\",\"tgt\",\"tgu\",\"tgv\",\"tgw\",\"tgx\",\"tgy\",\"tgz\",\"thc\",\"thd\",\"the\",\"thf\",\"thh\",\"thi\",\"thk\",\"thl\",\"thm\",\"thn\",\"thp\",\"thq\",\"thr\",\"ths\",\"tht\",\"thu\",\"thv\",\"thw\",\"thx\",\"thy\",\"thz\",\"tia\",\"tic\",\"tid\",\"tie\",\"tif\",\"tig\",\"tih\",\"tii\",\"tij\",\"tik\",\"til\",\"tim\",\"tin\",\"tio\",\"tip\",\"tiq\",\"tis\",\"tit\",\"tiu\",\"tiv\",\"tiw\",\"tix\",\"tiy\",\"tiz\",\"tja\",\"tjg\",\"tji\",\"tjl\",\"tjm\",\"tjn\",\"tjo\",\"tjs\",\"tju\",\"tjw\",\"tka\",\"tkb\",\"tkd\",\"tke\",\"tkf\",\"tkg\",\"tkk\",\"tkl\",\"tkm\",\"tkn\",\"tkp\",\"tkq\",\"tkr\",\"tks\",\"tkt\",\"tku\",\"tkv\",\"tkw\",\"tkx\",\"tkz\",\"tla\",\"tlb\",\"tlc\",\"tld\",\"tlf\",\"tlg\",\"tlh\",\"tli\",\"tlj\",\"tlk\",\"tll\",\"tlm\",\"tln\",\"tlo\",\"tlp\",\"tlq\",\"tlr\",\"tls\",\"tlt\",\"tlu\",\"tlv\",\"tlw\",\"tlx\",\"tly\",\"tma\",\"tmb\",\"tmc\",\"tmd\",\"tme\",\"tmf\",\"tmg\",\"tmh\",\"tmi\",\"tmj\",\"tmk\",\"tml\",\"tmm\",\"tmn\",\"tmo\",\"tmp\",\"tmq\",\"tmr\",\"tms\",\"tmt\",\"tmu\",\"tmv\",\"tmw\",\"tmy\",\"tmz\",\"tna\",\"tnb\",\"tnc\",\"tnd\",\"tne\",\"tnf\",\"tng\",\"tnh\",\"tni\",\"tnk\",\"tnl\",\"tnm\",\"tnn\",\"tno\",\"tnp\",\"tnq\",\"tnr\",\"tns\",\"tnt\",\"tnu\",\"tnv\",\"tnw\",\"tnx\",\"tny\",\"tnz\",\"tob\",\"toc\",\"tod\",\"toe\",\"tof\",\"tog\",\"toh\",\"toi\",\"toj\",\"tol\",\"tom\",\"too\",\"top\",\"toq\",\"tor\",\"tos\",\"tou\",\"tov\",\"tow\",\"tox\",\"toy\",\"toz\",\"tpa\",\"tpc\",\"tpe\",\"tpf\",\"tpg\",\"tpi\",\"tpj\",\"tpk\",\"tpl\",\"tpm\",\"tpn\",\"tpo\",\"tpp\",\"tpq\",\"tpr\",\"tpt\",\"tpu\",\"tpv\",\"tpw\",\"tpx\",\"tpy\",\"tpz\",\"tqb\",\"tql\",\"tqm\",\"tqn\",\"tqo\",\"tqp\",\"tqq\",\"tqr\",\"tqt\",\"tqu\",\"tqw\",\"tra\",\"trb\",\"trc\",\"trd\",\"tre\",\"trf\",\"trg\",\"trh\",\"tri\",\"trj\",\"trk\",\"trl\",\"trm\",\"trn\",\"tro\",\"trp\",\"trq\",\"trr\",\"trs\",\"trt\",\"tru\",\"trv\",\"trw\",\"trx\",\"try\",\"trz\",\"tsa\",\"tsb\",\"tsc\",\"tsd\",\"tse\",\"tsf\",\"tsg\",\"tsh\",\"tsi\",\"tsj\",\"tsk\",\"tsl\",\"tsm\",\"tsp\",\"tsq\",\"tsr\",\"tss\",\"tst\",\"tsu\",\"tsv\",\"tsw\",\"tsx\",\"tsy\",\"tsz\",\"tta\",\"ttb\",\"ttc\",\"ttd\",\"tte\",\"ttf\",\"ttg\",\"tth\",\"tti\",\"ttj\",\"ttk\",\"ttl\",\"ttm\",\"ttn\",\"tto\",\"ttp\",\"ttq\",\"ttr\",\"tts\",\"ttt\",\"ttu\",\"ttv\",\"ttw\",\"tty\",\"ttz\",\"tua\",\"tub\",\"tuc\",\"tud\",\"tue\",\"tuf\",\"tug\",\"tuh\",\"tui\",\"tuj\",\"tul\",\"tum\",\"tun\",\"tuo\",\"tup\",\"tuq\",\"tus\",\"tut\",\"tuu\",\"tuv\",\"tuw\",\"tux\",\"tuy\",\"tuz\",\"tva\",\"tvd\",\"tve\",\"tvk\",\"tvl\",\"tvm\",\"tvn\",\"tvo\",\"tvs\",\"tvt\",\"tvu\",\"tvw\",\"tvy\",\"twa\",\"twb\",\"twc\",\"twd\",\"twe\",\"twf\",\"twg\",\"twh\",\"twl\",\"twm\",\"twn\",\"two\",\"twp\",\"twq\",\"twr\",\"twt\",\"twu\",\"tww\",\"twx\",\"twy\",\"txa\",\"txb\",\"txc\",\"txe\",\"txg\",\"txh\",\"txi\",\"txj\",\"txm\",\"txn\",\"txo\",\"txq\",\"txr\",\"txs\",\"txt\",\"txu\",\"txx\",\"txy\",\"tya\",\"tye\",\"tyh\",\"tyi\",\"tyj\",\"tyl\",\"tyn\",\"typ\",\"tyr\",\"tys\",\"tyt\",\"tyu\",\"tyv\",\"tyx\",\"tyz\",\"tza\",\"tzh\",\"tzj\",\"tzl\",\"tzm\",\"tzn\",\"tzo\",\"tzx\",\"uam\",\"uan\",\"uar\",\"uba\",\"ubi\",\"ubl\",\"ubr\",\"ubu\",\"uby\",\"uda\",\"ude\",\"udg\",\"udi\",\"udj\",\"udl\",\"udm\",\"udu\",\"ues\",\"ufi\",\"uga\",\"ugb\",\"uge\",\"ugn\",\"ugo\",\"ugy\",\"uha\",\"uhn\",\"uis\",\"uiv\",\"uji\",\"uka\",\"ukg\",\"ukh\",\"ukk\",\"ukl\",\"ukp\",\"ukq\",\"uks\",\"uku\",\"ukw\",\"uky\",\"ula\",\"ulb\",\"ulc\",\"ule\",\"ulf\",\"uli\",\"ulk\",\"ull\",\"ulm\",\"uln\",\"ulu\",\"ulw\",\"uma\",\"umb\",\"umc\",\"umd\",\"umg\",\"umi\",\"umm\",\"umn\",\"umo\",\"ump\",\"umr\",\"ums\",\"umu\",\"una\",\"und\",\"une\",\"ung\",\"unk\",\"unm\",\"unn\",\"unp\",\"unr\",\"unu\",\"unx\",\"unz\",\"uok\",\"upi\",\"upv\",\"ura\",\"urb\",\"urc\",\"ure\",\"urf\",\"urg\",\"urh\",\"uri\",\"urj\",\"urk\",\"url\",\"urm\",\"urn\",\"uro\",\"urp\",\"urr\",\"urt\",\"uru\",\"urv\",\"urw\",\"urx\",\"ury\",\"urz\",\"usa\",\"ush\",\"usi\",\"usk\",\"usp\",\"usu\",\"uta\",\"ute\",\"utp\",\"utr\",\"utu\",\"uum\",\"uun\",\"uur\",\"uuu\",\"uve\",\"uvh\",\"uvl\",\"uwa\",\"uya\",\"uzn\",\"uzs\",\"vaa\",\"vae\",\"vaf\",\"vag\",\"vah\",\"vai\",\"vaj\",\"val\",\"vam\",\"van\",\"vao\",\"vap\",\"var\",\"vas\",\"vau\",\"vav\",\"vay\",\"vbb\",\"vbk\",\"vec\",\"ved\",\"vel\",\"vem\",\"veo\",\"vep\",\"ver\",\"vgr\",\"vgt\",\"vic\",\"vid\",\"vif\",\"vig\",\"vil\",\"vin\",\"vis\",\"vit\",\"viv\",\"vka\",\"vki\",\"vkj\",\"vkk\",\"vkl\",\"vkm\",\"vko\",\"vkp\",\"vkt\",\"vku\",\"vlp\",\"vls\",\"vma\",\"vmb\",\"vmc\",\"vmd\",\"vme\",\"vmf\",\"vmg\",\"vmh\",\"vmi\",\"vmj\",\"vmk\",\"vml\",\"vmm\",\"vmp\",\"vmq\",\"vmr\",\"vms\",\"vmu\",\"vmv\",\"vmw\",\"vmx\",\"vmy\",\"vmz\",\"vnk\",\"vnm\",\"vnp\",\"vor\",\"vot\",\"vra\",\"vro\",\"vrs\",\"vrt\",\"vsi\",\"vsl\",\"vsv\",\"vto\",\"vum\",\"vun\",\"vut\",\"vwa\",\"waa\",\"wab\",\"wac\",\"wad\",\"wae\",\"waf\",\"wag\",\"wah\",\"wai\",\"waj\",\"wak\",\"wal\",\"wam\",\"wan\",\"wao\",\"wap\",\"waq\",\"war\",\"was\",\"wat\",\"wau\",\"wav\",\"waw\",\"wax\",\"way\",\"waz\",\"wba\",\"wbb\",\"wbe\",\"wbf\",\"wbh\",\"wbi\",\"wbj\",\"wbk\",\"wbl\",\"wbm\",\"wbp\",\"wbq\",\"wbr\",\"wbs\",\"wbt\",\"wbv\",\"wbw\",\"wca\",\"wci\",\"wdd\",\"wdg\",\"wdj\",\"wdk\",\"wdu\",\"wdy\",\"wea\",\"wec\",\"wed\",\"weg\",\"weh\",\"wei\",\"wem\",\"wen\",\"weo\",\"wep\",\"wer\",\"wes\",\"wet\",\"weu\",\"wew\",\"wfg\",\"wga\",\"wgb\",\"wgg\",\"wgi\",\"wgo\",\"wgu\",\"wgw\",\"wgy\",\"wha\",\"whg\",\"whk\",\"whu\",\"wib\",\"wic\",\"wie\",\"wif\",\"wig\",\"wih\",\"wii\",\"wij\",\"wik\",\"wil\",\"wim\",\"win\",\"wir\",\"wit\",\"wiu\",\"wiv\",\"wiw\",\"wiy\",\"wja\",\"wji\",\"wka\",\"wkb\",\"wkd\",\"wkl\",\"wku\",\"wkw\",\"wky\",\"wla\",\"wlc\",\"wle\",\"wlg\",\"wli\",\"wlk\",\"wll\",\"wlm\",\"wlo\",\"wlr\",\"wls\",\"wlu\",\"wlv\",\"wlw\",\"wlx\",\"wly\",\"wma\",\"wmb\",\"wmc\",\"wmd\",\"wme\",\"wmh\",\"wmi\",\"wmm\",\"wmn\",\"wmo\",\"wms\",\"wmt\",\"wmw\",\"wmx\",\"wnb\",\"wnc\",\"wnd\",\"wne\",\"wng\",\"wni\",\"wnk\",\"wnm\",\"wnn\",\"wno\",\"wnp\",\"wnu\",\"wnw\",\"wny\",\"woa\",\"wob\",\"woc\",\"wod\",\"woe\",\"wof\",\"wog\",\"woi\",\"wok\",\"wom\",\"won\",\"woo\",\"wor\",\"wos\",\"wow\",\"woy\",\"wpc\",\"wra\",\"wrb\",\"wrd\",\"wrg\",\"wrh\",\"wri\",\"wrk\",\"wrl\",\"wrm\",\"wrn\",\"wro\",\"wrp\",\"wrr\",\"wrs\",\"wru\",\"wrv\",\"wrw\",\"wrx\",\"wry\",\"wrz\",\"wsa\",\"wsg\",\"wsi\",\"wsk\",\"wsr\",\"wss\",\"wsu\",\"wsv\",\"wtf\",\"wth\",\"wti\",\"wtk\",\"wtm\",\"wtw\",\"wua\",\"wub\",\"wud\",\"wuh\",\"wul\",\"wum\",\"wun\",\"wur\",\"wut\",\"wuu\",\"wuv\",\"wux\",\"wuy\",\"wwa\",\"wwb\",\"wwo\",\"wwr\",\"www\",\"wxa\",\"wxw\",\"wya\",\"wyb\",\"wyi\",\"wym\",\"wyr\",\"wyy\",\"xaa\",\"xab\",\"xac\",\"xad\",\"xae\",\"xag\",\"xai\",\"xaj\",\"xak\",\"xal\",\"xam\",\"xan\",\"xao\",\"xap\",\"xaq\",\"xar\",\"xas\",\"xat\",\"xau\",\"xav\",\"xaw\",\"xay\",\"xba\",\"xbb\",\"xbc\",\"xbd\",\"xbe\",\"xbg\",\"xbi\",\"xbj\",\"xbm\",\"xbn\",\"xbo\",\"xbp\",\"xbr\",\"xbw\",\"xbx\",\"xby\",\"xcb\",\"xcc\",\"xce\",\"xcg\",\"xch\",\"xcl\",\"xcm\",\"xcn\",\"xco\",\"xcr\",\"xct\",\"xcu\",\"xcv\",\"xcw\",\"xcy\",\"xda\",\"xdc\",\"xdk\",\"xdm\",\"xdo\",\"xdy\",\"xeb\",\"xed\",\"xeg\",\"xel\",\"xem\",\"xep\",\"xer\",\"xes\",\"xet\",\"xeu\",\"xfa\",\"xga\",\"xgb\",\"xgd\",\"xgf\",\"xgg\",\"xgi\",\"xgl\",\"xgm\",\"xgn\",\"xgr\",\"xgu\",\"xgw\",\"xha\",\"xhc\",\"xhd\",\"xhe\",\"xhr\",\"xht\",\"xhu\",\"xhv\",\"xia\",\"xib\",\"xii\",\"xil\",\"xin\",\"xip\",\"xir\",\"xis\",\"xiv\",\"xiy\",\"xjb\",\"xjt\",\"xka\",\"xkb\",\"xkc\",\"xkd\",\"xke\",\"xkf\",\"xkg\",\"xkh\",\"xki\",\"xkj\",\"xkk\",\"xkl\",\"xkn\",\"xko\",\"xkp\",\"xkq\",\"xkr\",\"xks\",\"xkt\",\"xku\",\"xkv\",\"xkw\",\"xkx\",\"xky\",\"xkz\",\"xla\",\"xlb\",\"xlc\",\"xld\",\"xle\",\"xlg\",\"xli\",\"xln\",\"xlo\",\"xlp\",\"xls\",\"xlu\",\"xly\",\"xma\",\"xmb\",\"xmc\",\"xmd\",\"xme\",\"xmf\",\"xmg\",\"xmh\",\"xmj\",\"xmk\",\"xml\",\"xmm\",\"xmn\",\"xmo\",\"xmp\",\"xmq\",\"xmr\",\"xms\",\"xmt\",\"xmu\",\"xmv\",\"xmw\",\"xmx\",\"xmy\",\"xmz\",\"xna\",\"xnb\",\"xnd\",\"xng\",\"xnh\",\"xni\",\"xnk\",\"xnn\",\"xno\",\"xnr\",\"xns\",\"xnt\",\"xnu\",\"xny\",\"xnz\",\"xoc\",\"xod\",\"xog\",\"xoi\",\"xok\",\"xom\",\"xon\",\"xoo\",\"xop\",\"xor\",\"xow\",\"xpa\",\"xpc\",\"xpe\",\"xpg\",\"xpi\",\"xpj\",\"xpk\",\"xpm\",\"xpn\",\"xpo\",\"xpp\",\"xpq\",\"xpr\",\"xps\",\"xpt\",\"xpu\",\"xpy\",\"xqa\",\"xqt\",\"xra\",\"xrb\",\"xrd\",\"xre\",\"xrg\",\"xri\",\"xrm\",\"xrn\",\"xrq\",\"xrr\",\"xrt\",\"xru\",\"xrw\",\"xsa\",\"xsb\",\"xsc\",\"xsd\",\"xse\",\"xsh\",\"xsi\",\"xsj\",\"xsl\",\"xsm\",\"xsn\",\"xso\",\"xsp\",\"xsq\",\"xsr\",\"xss\",\"xsu\",\"xsv\",\"xsy\",\"xta\",\"xtb\",\"xtc\",\"xtd\",\"xte\",\"xtg\",\"xth\",\"xti\",\"xtj\",\"xtl\",\"xtm\",\"xtn\",\"xto\",\"xtp\",\"xtq\",\"xtr\",\"xts\",\"xtt\",\"xtu\",\"xtv\",\"xtw\",\"xty\",\"xtz\",\"xua\",\"xub\",\"xud\",\"xug\",\"xuj\",\"xul\",\"xum\",\"xun\",\"xuo\",\"xup\",\"xur\",\"xut\",\"xuu\",\"xve\",\"xvi\",\"xvn\",\"xvo\",\"xvs\",\"xwa\",\"xwc\",\"xwd\",\"xwe\",\"xwg\",\"xwj\",\"xwk\",\"xwl\",\"xwo\",\"xwr\",\"xwt\",\"xww\",\"xxb\",\"xxk\",\"xxm\",\"xxr\",\"xxt\",\"xya\",\"xyb\",\"xyj\",\"xyk\",\"xyl\",\"xyt\",\"xyy\",\"xzh\",\"xzm\",\"xzp\",\"yaa\",\"yab\",\"yac\",\"yad\",\"yae\",\"yaf\",\"yag\",\"yah\",\"yai\",\"yaj\",\"yak\",\"yal\",\"yam\",\"yan\",\"yao\",\"yap\",\"yaq\",\"yar\",\"yas\",\"yat\",\"yau\",\"yav\",\"yaw\",\"yax\",\"yay\",\"yaz\",\"yba\",\"ybb\",\"ybd\",\"ybe\",\"ybh\",\"ybi\",\"ybj\",\"ybk\",\"ybl\",\"ybm\",\"ybn\",\"ybo\",\"ybx\",\"yby\",\"ych\",\"ycl\",\"ycn\",\"ycp\",\"yda\",\"ydd\",\"yde\",\"ydg\",\"ydk\",\"yds\",\"yea\",\"yec\",\"yee\",\"yei\",\"yej\",\"yel\",\"yen\",\"yer\",\"yes\",\"yet\",\"yeu\",\"yev\",\"yey\",\"yga\",\"ygi\",\"ygl\",\"ygm\",\"ygp\",\"ygr\",\"ygs\",\"ygu\",\"ygw\",\"yha\",\"yhd\",\"yhl\",\"yhs\",\"yia\",\"yif\",\"yig\",\"yih\",\"yii\",\"yij\",\"yik\",\"yil\",\"yim\",\"yin\",\"yip\",\"yiq\",\"yir\",\"yis\",\"yit\",\"yiu\",\"yiv\",\"yix\",\"yiy\",\"yiz\",\"yka\",\"ykg\",\"yki\",\"ykk\",\"ykl\",\"ykm\",\"ykn\",\"yko\",\"ykr\",\"ykt\",\"yku\",\"yky\",\"yla\",\"ylb\",\"yle\",\"ylg\",\"yli\",\"yll\",\"ylm\",\"yln\",\"ylo\",\"ylr\",\"ylu\",\"yly\",\"yma\",\"ymb\",\"ymc\",\"ymd\",\"yme\",\"ymg\",\"ymh\",\"ymi\",\"ymk\",\"yml\",\"ymm\",\"ymn\",\"ymo\",\"ymp\",\"ymq\",\"ymr\",\"yms\",\"ymt\",\"ymx\",\"ymz\",\"yna\",\"ynd\",\"yne\",\"yng\",\"ynh\",\"ynk\",\"ynl\",\"ynn\",\"yno\",\"ynq\",\"yns\",\"ynu\",\"yob\",\"yog\",\"yoi\",\"yok\",\"yol\",\"yom\",\"yon\",\"yos\",\"yot\",\"yox\",\"yoy\",\"ypa\",\"ypb\",\"ypg\",\"yph\",\"ypk\",\"ypm\",\"ypn\",\"ypo\",\"ypp\",\"ypz\",\"yra\",\"yrb\",\"yre\",\"yri\",\"yrk\",\"yrl\",\"yrm\",\"yrn\",\"yro\",\"yrs\",\"yrw\",\"yry\",\"ysc\",\"ysd\",\"ysg\",\"ysl\",\"ysn\",\"yso\",\"ysp\",\"ysr\",\"yss\",\"ysy\",\"yta\",\"ytl\",\"ytp\",\"ytw\",\"yty\",\"yua\",\"yub\",\"yuc\",\"yud\",\"yue\",\"yuf\",\"yug\",\"yui\",\"yuj\",\"yuk\",\"yul\",\"yum\",\"yun\",\"yup\",\"yuq\",\"yur\",\"yut\",\"yuu\",\"yuw\",\"yux\",\"yuy\",\"yuz\",\"yva\",\"yvt\",\"ywa\",\"ywg\",\"ywl\",\"ywn\",\"ywq\",\"ywr\",\"ywt\",\"ywu\",\"yww\",\"yxa\",\"yxg\",\"yxl\",\"yxm\",\"yxu\",\"yxy\",\"yyr\",\"yyu\",\"yyz\",\"yzg\",\"yzk\",\"zaa\",\"zab\",\"zac\",\"zad\",\"zae\",\"zaf\",\"zag\",\"zah\",\"zai\",\"zaj\",\"zak\",\"zal\",\"zam\",\"zao\",\"zap\",\"zaq\",\"zar\",\"zas\",\"zat\",\"zau\",\"zav\",\"zaw\",\"zax\",\"zay\",\"zaz\",\"zbc\",\"zbe\",\"zbl\",\"zbt\",\"zbw\",\"zca\",\"zch\",\"zdj\",\"zea\",\"zeg\",\"zeh\",\"zen\",\"zga\",\"zgb\",\"zgh\",\"zgm\",\"zgn\",\"zgr\",\"zhb\",\"zhd\",\"zhi\",\"zhn\",\"zhw\",\"zhx\",\"zia\",\"zib\",\"zik\",\"zil\",\"zim\",\"zin\",\"zir\",\"ziw\",\"ziz\",\"zka\",\"zkb\",\"zkd\",\"zkg\",\"zkh\",\"zkk\",\"zkn\",\"zko\",\"zkp\",\"zkr\",\"zkt\",\"zku\",\"zkv\",\"zkz\",\"zle\",\"zlj\",\"zlm\",\"zln\",\"zlq\",\"zls\",\"zlw\",\"zma\",\"zmb\",\"zmc\",\"zmd\",\"zme\",\"zmf\",\"zmg\",\"zmh\",\"zmi\",\"zmj\",\"zmk\",\"zml\",\"zmm\",\"zmn\",\"zmo\",\"zmp\",\"zmq\",\"zmr\",\"zms\",\"zmt\",\"zmu\",\"zmv\",\"zmw\",\"zmx\",\"zmy\",\"zmz\",\"zna\",\"znd\",\"zne\",\"zng\",\"znk\",\"zns\",\"zoc\",\"zoh\",\"zom\",\"zoo\",\"zoq\",\"zor\",\"zos\",\"zpa\",\"zpb\",\"zpc\",\"zpd\",\"zpe\",\"zpf\",\"zpg\",\"zph\",\"zpi\",\"zpj\",\"zpk\",\"zpl\",\"zpm\",\"zpn\",\"zpo\",\"zpp\",\"zpq\",\"zpr\",\"zps\",\"zpt\",\"zpu\",\"zpv\",\"zpw\",\"zpx\",\"zpy\",\"zpz\",\"zqe\",\"zra\",\"zrg\",\"zrn\",\"zro\",\"zrp\",\"zrs\",\"zsa\",\"zsk\",\"zsl\",\"zsm\",\"zsr\",\"zsu\",\"zte\",\"ztg\",\"ztl\",\"ztm\",\"ztn\",\"ztp\",\"ztq\",\"zts\",\"ztt\",\"ztu\",\"ztx\",\"zty\",\"zua\",\"zuh\",\"zum\",\"zun\",\"zuy\",\"zwa\",\"zxx\",\"zyb\",\"zyg\",\"zyj\",\"zyn\",\"zyp\",\"zza\",\"zzj\"]\n;return axe.utils.validLangs=function(){\"use strict\";return N},commons}()})}(\"object\"==typeof window?window:this);";
+const pageFunctions=require('../../lib/page-functions');
 
 
 
@@ -9302,6 +9889,7 @@
 
 axeResult.violations.forEach(v=>v.nodes.forEach(node=>{
 node.path=getNodePath(node.element);
+
 node.snippet=getOuterHTMLSnippet(node.element);
 
 node.element=node.any=node.all=node.none=undefined;
@@ -9342,18 +9930,6 @@
 path.reverse();
 return path.join(',');
 }
-
-
-
-
-
-
-function getOuterHTMLSnippet(el){
-const reOpeningTag=/^.*?>/;
-const match=el.outerHTML.match(reOpeningTag);
-
-return match&&match[0]||'';
-}
 }
 
 class Accessibility extends Gatherer{
@@ -9364,6 +9940,7 @@
 afterPass(passContext){
 const driver=passContext.driver;
 const expression=`(function () {
+      ${pageFunctions.getOuterHTMLSnippetString};
       ${axeLibSource};
       return (${runA11yChecks.toString()}());
     })()`;
@@ -9382,7 +9959,7 @@
 
 module.exports=Accessibility;
 
-},{"./gatherer":19}],"../gather/gatherers/cache-contents":[function(require,module,exports){
+},{"../../lib/page-functions":89,"./gatherer":21}],"../gather/gatherers/cache-contents":[function(require,module,exports){
 
 
 
@@ -9443,7 +10020,7 @@
 
 module.exports=CacheContents;
 
-},{"./gatherer":19}],"../gather/gatherers/chrome-console-messages":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/chrome-console-messages":[function(require,module,exports){
 
 
 
@@ -9499,7 +10076,7 @@
 
 module.exports=ChromeConsoleMessages;
 
-},{"./gatherer":19}],"../gather/gatherers/css-usage":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/css-usage":[function(require,module,exports){
 
 
 
@@ -9560,7 +10137,7 @@
 
 module.exports=CSSUsage;
 
-},{"./gatherer":19}],"../gather/gatherers/dobetterweb/anchors-with-no-rel-noopener":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/dobetterweb/anchors-with-no-rel-noopener":[function(require,module,exports){
 
 
 
@@ -9569,7 +10146,7 @@
 'use strict';
 
 const Gatherer=require('../gatherer');
-const DOMHelpers=require('../../../lib/dom-helpers.js');
+const pageFunctions=require('../../../lib/page-functions.js');
 
 class AnchorsWithNoRelNoopener extends Gatherer{
 
@@ -9578,13 +10155,15 @@
 
 afterPass(passContext){
 const expression=`(function() {
-      ${DOMHelpers.getElementsInDocumentFnString}; // define function on page
+      ${pageFunctions.getOuterHTMLSnippetString};
+      ${pageFunctions.getElementsInDocumentString}; // define function on page
       const selector = 'a[target="_blank"]:not([rel~="noopener"]):not([rel~="noreferrer"])';
       const elements = getElementsInDocument(selector);
       return elements.map(node => ({
         href: node.href,
         rel: node.getAttribute('rel'),
-        target: node.getAttribute('target')
+        target: node.getAttribute('target'),
+        outerHTML: getOuterHTMLSnippet(node),
       }));
     })()`;
 
@@ -9594,7 +10173,7 @@
 
 module.exports=AnchorsWithNoRelNoopener;
 
-},{"../../../lib/dom-helpers.js":30,"../gatherer":19}],"../gather/gatherers/dobetterweb/appcache":[function(require,module,exports){
+},{"../../../lib/page-functions.js":89,"../gatherer":21}],"../gather/gatherers/dobetterweb/appcache":[function(require,module,exports){
 
 
 
@@ -9621,7 +10200,7 @@
 
 module.exports=AppCacheManifest;
 
-},{"../gatherer":19}],"../gather/gatherers/dobetterweb/doctype":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/dobetterweb/doctype":[function(require,module,exports){
 
 
 
@@ -9659,7 +10238,7 @@
 
 module.exports=Doctype;
 
-},{"../gatherer":19}],"../gather/gatherers/dobetterweb/domstats":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/dobetterweb/domstats":[function(require,module,exports){
 
 
 
@@ -9676,18 +10255,7 @@
 'use strict';
 
 const Gatherer=require('../gatherer');
-
-
-
-
-
-
-
-function getOuterHTMLSnippet(element){
-const reOpeningTag=/^.*?>/;
-const match=element.outerHTML.match(reOpeningTag);
-return match&&match[0];
-}
+const pageFunctions=require('../../../lib/page-functions');
 
 
 
@@ -9796,12 +10364,13 @@
 depth:{
 max:result.maxDepth,
 pathToElement:elementPathInDOM(deepestNode),
-snippet:getOuterHTMLSnippet(deepestNode)},
+
+snippet:getOuterHTMLSnippet(deepestNode,['style'])},
 
 width:{
 max:result.maxWidth,
 pathToElement:elementPathInDOM(parentWithMostChildren),
-snippet:getOuterHTMLSnippet(parentWithMostChildren)}};
+snippet:getOuterHTMLSnippet(parentWithMostChildren,['style'])}};
 
 
 }
@@ -9813,7 +10382,7 @@
 
 afterPass(passContext){
 const expression=`(function() {
-      ${getOuterHTMLSnippet.toString()};
+      ${pageFunctions.getOuterHTMLSnippetString};
       ${createSelectorsLabel.toString()};
       ${elementPathInDOM.toString()};
       return (${getDOMStats.toString()}(document.documentElement));
@@ -9829,7 +10398,7 @@
 
 module.exports=DOMStats;
 
-},{"../gatherer":19}],"../gather/gatherers/dobetterweb/js-libraries":[function(require,module,exports){
+},{"../../../lib/page-functions":89,"../gatherer":21}],"../gather/gatherers/dobetterweb/js-libraries":[function(require,module,exports){
 
 
 
@@ -9847,7 +10416,7 @@
 
 const Gatherer=require('../gatherer');
 
-const libDetectorSource="var UNKNOWN_VERSION = null;\nvar d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests = {\n\n    'GWT': {\n        icon: 'gwt',\n        url: 'http://www.gwtproject.org/',\n        test: function(win) {\n            // pretty complicated, many possible tell tales\n            var doc = win.document,\n                hasHistFrame = doc.getElementById('__gwt_historyFrame'),\n                hasGwtUid = doc.gwt_uid,\n                hasBodyListener = doc.body.__listener,\n                hasBodyEventBits = doc.body.__eventBits,\n                hasModules = win.__gwt_activeModules,\n                hasJsonP = win.__gwt_jsonp__,\n                hasRootWinApp = win.__gwt_scriptsLoaded || win.__gwt_stylesLoaded || win.__gwt_activeModules;\n\n            // use the many possible indicators\n            if(hasHistFrame || hasGwtUid || hasBodyListener || hasBodyEventBits || hasModules || hasJsonP || hasRootWinApp) {\n\n                // carefully look at frames, but only if certain is GWT frame\n                var frames = doc.getElementsByTagName('iframe'),\n                    gwtVersion = UNKNOWN_VERSION;\n                for(var n=0; n<frames.length; n++) {\n                    // catch security access errors\n                    try {\n                        var hasNegativeTabIndex = frames[n].tabIndex < 0; // on for GWT\n                        if(hasNegativeTabIndex && frames[n].contentWindow && frames[n].contentWindow.$gwt_version) {\n                            gwtVersion = frames[n].contentWindow.$gwt_version;\n                            break;\n                        }\n                    }\n                    catch(e) {}\n                }\n\n                if(gwtVersion=='0.0.999') {\n                  gwtVersion = 'Google Internal';\n                }\n\n                return { version: gwtVersion };\n            }\n            return false;\n        }\n    },\n\n    'Ink': {\n        icon: 'ink',\n        url: 'http://ink.sapo.pt/',\n        test: function(win) {\n            if (win.Ink && win.Ink.createModule) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Vaadin': {\n        icon: 'vaadin',\n        url: 'http://vaadin.com/home',\n        test: function(win) {\n            if (win.vaadin && win.vaadin.registerWidgetset) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Bootstrap': {\n        icon: 'bootstrap',\n        url: 'http://getbootstrap.com/',\n        npm: 'bootstrap',\n        // look for a function Boostrap has added to jQuery - regex for BS 2 & 3\n        test: function(win) {\n            var jQueryAvailable = win.$ && win.$.fn,\n                RE_PREFIX_V2 = '\\\\$this\\\\.data\\\\((?:\\'|\")',\n                RE_PREFIX_V3 = '\\\\$this\\\\.data\\\\((?:\\'|\")(?:bs\\\\.){1}',\n                bootstrapComponents = [\n                    'affix', 'alert', 'button', 'carousel', 'collapse', 'dropdown',\n                    'modal', 'popover', 'scrollspy', 'tab', 'tooltip'\n                ];\n\n            if(jQueryAvailable) {\n                var bootstrapVersion;\n\n                bootstrapComponents.some(function(component) {\n                    if(win.$.fn[component]) {\n                        // Bootstrap >= 3.2.0 detection\n                        if(win.$.fn[component].Constructor && win.$.fn[component].Constructor.VERSION) {\n                            bootstrapVersion = win.$.fn[component].Constructor.VERSION;\n                            return true;\n                        // Bootstrap >= 2.0.0 and <= 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V3 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 3.0.0 & <= 3.1.1';\n                            return true;\n                        // Bootstrap < 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V2 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 2.0.0 & <= 2.3.2';\n                            return true;\n                        }\n                    }\n\n                    return false;\n                });\n\n                if (bootstrapVersion) {\n                    return { version: bootstrapVersion };\n                }\n            }\n\n            return false;\n        }\n    },\n\n    'Zurb': {\n        icon: 'zurb',\n        url: 'http://foundation.zurb.com/',\n        npm: 'foundation-sites',\n        test: function(win) {\n            if(win.Foundation && win.Foundation.Toggler) {\n                return { version: win.Foundation.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Polymer': {\n        icon: 'polymer',\n        url: 'http://www.polymer-project.org/',\n        npm: '@polymer/polymer',\n        test: function(win) {\n            if(win.Polymer && win.Polymer.dom) {\n                return { version: win.Polymer.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Highcharts': {\n        icon: 'highcharts',\n        url: 'http://www.highcharts.com',\n        npm: 'highcharts',\n        test: function(win) {\n            if(win.Highcharts && win.Highcharts.Point) {\n                return { version: win.Highcharts.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'InfoVis': {\n        icon: 'jit',\n        url: 'http://philogb.github.com/jit/',\n        test: function test(win) {\n            if(win.$jit && win.$jit.PieChart) {\n                return { version: win.$jit.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'FlotCharts': {\n        icon: 'icon_48',\n        url: 'http://www.flotcharts.org/',\n        npm: 'flot',\n        test: function(win) {\n            if(win.$ && win.$.plot) {\n                return { version: win.$.plot.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Blackbird': {\n        icon: 'blackbird',\n        url: 'http://www.gscottolson.com/blackbirdjs/',\n        test: function(win) {\n            if(win.log && win.log.warn) {\n                return { version: UNKNOWN_VERSION}; // no version info\n            }\n            return false;\n        }\n    },\n\n    'CreateJS': {\n        icon: 'createjs',\n        url: 'http://createjs.com/#!/CreateJS',\n        npm: 'createjs',\n        test: function(win) {\n            if(win.createjs && win.createjs.promote) {\n                return { version: UNKNOWN_VERSION}; // no version info available\n            }\n            return false;\n        }\n    },\n\n    'Google Maps': {\n        icon: 'gmaps',\n        url: 'https://developers.google.com/maps/',\n        test: function(win) {\n            if (win.google && win.google.maps) {\n                return { version: win.google.maps.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function(win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn) {\n                return { version: jq.fn.jquery.replace(/[^\\d+\\.+]/g, '') || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery UI': {\n        icon: 'jquery_ui',\n        url: 'http://jqueryui.com',\n        npm: 'jquery-ui',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.ui) {\n                var plugins = 'accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs'.split(','), concat = [];\n                for (var i=0; i < plugins.length; i++) { if(jq.ui[plugins[i]]) concat.push(plugins[i].substr(0,1).toUpperCase() + plugins[i].substr(1)); }\n                return { version: jq.ui.version || UNKNOWN_VERSION, details: concat.length ? 'Plugins used: '+concat.join(',') : '' };\n            }\n            return false;\n        }\n    },\n\n    'Dojo': {\n        icon: 'dojo',\n        url: 'http://dojotoolkit.org',\n        npm: 'dojo',\n        test: function(win) {\n            if(win.dojo && win.dojo.delegate) {\n                var version = win.dojo.version ? win.dojo.version.toString() : UNKNOWN_VERSION;\n                return { version: version, details: 'Details: '+(win.dijit ? 'Uses Dijit' : 'none') };\n            }\n            return false;\n        }\n    },\n\n    'Prototype': {\n        icon: 'prototype',\n        url: 'http://prototypejs.org',\n        test: function(win) {\n            if(win.Prototype && win.Prototype.BrowserFeatures) {\n                return { version: win.Prototype.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Scriptaculous': {\n        icon: 'scriptaculous',\n        url: 'http://script.aculo.us',\n        test: function(win) {\n            if(win.Scriptaculous && win.Scriptaculous.load) {\n                return { version: win.Scriptaculous.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'MooTools': {\n        icon: 'mootools',\n        url: 'http://mootools.net',\n        test: function(win) {\n            if(win.MooTools && win.MooTools.build) {\n                return { version: win.MooTools.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spry': {\n        icon: 'spry',\n        url: 'http://labs.adobe.com/technologies/spry',\n        test: function(win) {\n            if (win.Spry && win.Spry.Data) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 2': {\n        icon: 'yui',\n        url: 'http://developer.yahoo.com/yui/2/',\n        test: function(win) {\n            if (win.YAHOO && win.YAHOO.util) {\n                return { version: win.YAHOO.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 3': {\n        icon: 'yui3',\n        url: 'http://yuilibrary.com/',\n        npm: 'yui',\n        test: function(win) {\n            if (win.YUI && win.YUI.Env) {\n                return { version: win.YUI.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Qooxdoo': {\n        icon: 'qooxdoo',\n        url: 'http://qooxdoo.org',\n        npm: 'qooxdoo',\n        test: function(win) {\n            if(win.qx && win.qx.Bootstrap) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ext JS': {\n        icon: 'extjs',\n        url: 'http://www.sencha.com/products/extjs',\n        test: function(win) {\n            if (win.Ext && win.Ext.versions) {\n                return { version: win.Ext.versions.core.version };\n            }\n            else if(win.Ext) {\n                return { version: win.Ext.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'base2': {\n        icon: 'base2',\n        url: 'http://code.google.com/p/base2',\n        test: function(win) {\n            if(win.base2 && win.base2.dom) {\n                return { version: win.base2.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Closure Library': {\n        icon: 'closure',\n        url: 'https://developers.google.com/closure/library',\n        npm: 'google-closure-library',\n        test: function(win) {\n            if(win.goog && win.goog.provide) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Rapha&euml;l': {\n        icon: 'raphael',\n        url: 'http://dmitrybaranovskiy.github.io/raphael',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.circle) {\n                return { version: win.Raphael.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React': {\n        icon: 'react',\n        url: 'https://facebook.github.io/react/',\n        npm: 'react',\n        test: function(win) {\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            if (reactRoot && reactRoot.innerText.length > 0 || altHasReact || win.React && win.React.Component) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Modernizr': {\n        icon: 'modernizr',\n        url: 'http://www.modernizr.com',\n        npm: 'modernizr',\n        test: function(win) {\n            if (win.Modernizr && win.Modernizr.addTest) {\n                return { version: win.Modernizr._version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Processing.js': {\n        icon: 'processingjs',\n        url: 'http://processingjs.org',\n        npm: 'processing-js',\n        test: function(win) {\n            if(win.Processing && win.Processing.box) {\n                return { version: Processing.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Backbone': {\n        icon: 'backbone',\n        url: 'http://backbonejs.org/',\n        npm: 'backbone',\n        test: function(win) {\n            if (win.Backbone && win.Backbone.Model.extend) {\n                return {version: win.Backbone.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Leaflet': {\n        icon: 'leaflet',\n        url: 'http://leafletjs.com',\n        npm: 'leaflet',\n        test: function(win) {\n            // Leaflet 3.1 uses L.Marker and L.VERSION; later versions use L.marker and L.version\n            if (win.L && win.L.GeoJSON && (win.L.marker || win.L.Marker)) {\n                return { version: win.L.version || win.L.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Mapbox': {\n        icon: 'mapbox',\n        url: 'http://mapbox.com',\n        npm: 'mapbox-gl',\n        test: function(win) {\n            if (win.L && win.L.mapbox && win.L.mapbox.geocoder) {\n                return { version: win.L.mapbox.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Lo-Dash': {\n        icon: 'lodash',\n        url: 'http://lodash.com/',\n        npm: 'lodash',\n        test: function(win) {\n            var _ = typeof (_ = win._) == 'function' && _,\n                chain = typeof (chain = _ && _.chain) == 'function' && chain,\n                wrapper = (chain || _ || function() { return {}; })(1);\n\n            if (_ && wrapper.__wrapped__) {\n                return { version: _.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Underscore': {\n        icon: 'underscore',\n        url: 'http://underscorejs.org/',\n        npm: 'underscore',\n        test: function(win) {\n            if (win._ && typeof win._.tap === 'function' &&\n                !d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests['Lo-Dash'].test(win)) {\n                return {version: win._.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Sammy': {\n        icon: 'sammy',\n        url: 'http://sammyjs.org',\n        test: function(win) {\n            if (win.Sammy && win.Sammy.Application.curry) {\n                return {version: win.Sammy.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Rico': {\n        icon: 'rico',\n        url: 'http://openrico.sourceforge.net/examples/index.html',\n        test:  function(win) {\n            if (win.Rico && window.Rico.checkIfComplete) {\n                return {version: win.Rico.Version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'MochiKit': {\n        icon: 'mochikit',\n        url: 'https://mochi.github.io/mochikit/',\n        test: function(win) {\n            if (win.MochiKit && win.MochiKit.Base.module) {\n                return {version: MochiKit.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'gRapha&euml;l': {\n        icon: 'graphael',\n        url: 'http://g.raphaeljs.com',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.fn.g) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Glow': {\n        icon: 'glow',\n        url: 'http://www.bbc.co.uk/glow',\n        test: function(win) {\n            if (win.gloader && win.gloader.getRequests) {\n                return {version: UNKNOWN_VERSION};\n            }\n            else if (win.glow && win.glow.dom) {\n                return {version: win.glow.VERSION || UNKNOWN_VERSION};\n            }\n            else if (win.Glow) {\n                return {version: win.Glow.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Socket.IO': {\n        icon: 'socketio', // currently has no icon\n        url: 'http://socket.io',\n        npm: 'socket.io',\n        test: function(win) {\n            // version 0.6.2 uses only io.Socket; more recent versions also have io.sockets\n            if (win.io && (win.io.sockets || win.io.Socket)) {\n                return {version: win.io.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Mustache': {\n        icon: 'mustache',\n        url: 'http://mustache.github.com',\n        npm: 'mustache',\n        test: function(win) {\n            if (win.Mustache && win.Mustache.to_html) {\n                return {version: win.Mustache.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Fabric.js': {\n        icon: 'icon_48', // currently has no icon\n        url: 'http://fabricjs.com/',\n        npm: 'fabric',\n        test: function(win) {\n            if (win.fabric && win.fabric.util) {\n                return {version: win.fabric.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'FuseJS': {\n        icon: 'fusejs',\n        url: 'http://fusejs.io/',\n        npm: 'fuse.js',\n        test: function(win) {\n            if (win.Fuse) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Tween.js': {\n        icon: 'icon_48', // currently has no icon\n        url: 'https://github.com/sole/tween.js',\n        npm: 'tween.js',\n        test: function(win) {\n            if (win.TWEEN && win.TWEEN.Easing) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'SproutCore': {\n       icon: 'sproutcore',\n       url: 'http://www.sproutcore.com',\n       test: function(win) {\n           if (win.SC && win.SC.Application) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'Zepto.js': {\n       icon: 'zepto',\n       url: 'http://zeptojs.com',\n       npm: 'zepto',\n       test: function(win) {\n           if (win.Zepto && win.Zepto.fn) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'three.js': {\n       icon: 'icon_48', // currently has no icon\n       url: 'http://threejs.org/',\n       npm: 'three',\n       test: function(win) {\n           if (win.THREE && win.THREE.REVISION) {\n               return {version: 'r' + win.THREE.REVISION};\n           }\n           else if (win.THREE) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'PhiloGL': {\n       icon: 'philogl',\n       url: 'http://www.senchalabs.org/philogl/',\n       npm: 'philogl',\n       test: function(win) {\n           if (win.PhiloGL && win.PhiloGL.Camera) {\n               return {version: win.PhiloGL.version || UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'CamanJS': {\n        icon: 'camanjs',\n        url: 'http://camanjs.com/',\n        npm: 'caman',\n        test: function(win) {\n            if (win.Caman && win.Caman.version) {\n                return {version: win.Caman.version.release};\n            }\n            else if (win.Caman) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'yepnope': {\n        icon: 'yepnope',\n        url: 'http://yepnopejs.com/',\n        test: function(win) {\n            if (win.yepnope && win.yepnope.injectJs) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'LABjs': {\n        icon: 'icon_48',\n        url: 'http://labjs.com/',\n        test: function(win) {\n            if (win.$LAB && win.$LAB.setOptions) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Head JS': {\n        icon: 'headjs',\n        url: 'http://headjs.com/',\n        npm: 'headjs',\n        test: function(win) {\n            if (win.head && win.head.js) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'ControlJS': {\n        icon: 'icon_48',\n        url: 'http://stevesouders.com/controljs/',\n        test: function(win) {\n            if (win.CJS && win.CJS.start) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'RequireJS': {\n        icon: 'requirejs',\n        url: 'http://requirejs.org/',\n        npm: 'requirejs',\n        test: function(win) {\n            var req = win.require || win.requirejs;\n            if (req && (req.load || (req.s && req.s.contexts && req.s.contexts._ && (req.s.contexts._.loaded || req.s.contexts._.load)))) {\n                return { version: req.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'RightJS': {\n        icon: 'rightjs',\n        url: 'http://rightjs.org/',\n        test: function(win) {\n            if (win.RightJS && win.RightJS.isNode) {\n                return { version: win.RightJS.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery Tools': {\n       icon: 'jquerytools',\n       url: 'http://jquerytools.github.io/',\n       test: function(win) {\n            var jq = win.jQuery || win.$;\n            if(jq && jq.tools) {\n               return { version: jq.tools.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Pusher': {\n       icon: 'pusher',\n       url: 'http://pusher.com/docs/pusher_js/',\n       npm: 'pusher-js',\n       test: function(win) {\n            if(win.Pusher && win.Pusher.Channel) {\n               return { version: win.Pusher.VERSION || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Paper.js': {\n       icon: 'paperjs',\n       url: 'http://paperjs.org/',\n       npm: 'paper',\n       test: function(win) {\n            if(win.paper && win.paper.Point) {\n               return { version: win.paper.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Swiffy': {\n       icon: 'icon_48',\n       url: 'http://www.google.com/doubleclick/studio/swiffy/',\n       test: function(win) {\n            if(win.swiffy && win.swiffy.Stage) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Move': {\n       icon: 'move',\n       url: 'https://github.com/rsms/move',\n       npm: 'move',\n       test: function(win) {\n            if(win.move && win.move.compile) {\n               return { version: win.move.version() || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'AmplifyJS': {\n       icon: 'amplifyjs',\n       url: 'http://amplifyjs.com/',\n       npm: 'amplifyjs',\n       test: function(win) {\n            if(win.amplify && win.amplify.publish) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Popcorn.js': {\n       icon: 'popcornjs',\n       url: 'http://popcornjs.org/',\n       test: function(win) {\n            if (win.Popcorn && win.Popcorn.Events) {\n               return { version: win.Popcorn.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'D3': {\n        icon: 'd3',\n        url: 'http://d3js.org',\n        npm: 'd3',\n        test: function(win) {\n            if (win.d3 && win.d3.select) {\n                return { version: win.d3.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Handlebars': {\n        icon: 'handlebars',\n        url: 'http://handlebarsjs.com/',\n        npm: 'handlebars',\n        test: function(win) {\n            if(win.Handlebars && win.Handlebars.compile) {\n                return { version: win.Handlebars.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Knockout': {\n        icon: 'knockout',\n        url: 'http://knockoutjs.com/',\n        npm: 'knockout',\n        test: function(win) {\n            if (win.ko && win.ko.applyBindings) {\n                return { version: win.ko.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spine': {\n        icon: 'icon_48',\n        url: 'http://spinejs.com/',\n        test: function(win) {\n            if (win.Spine && win.Spine.Controller) {\n                return {version: win.Spine.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery Mobile': {\n        icon: 'jquery_mobile',\n        url: 'http://jquerymobile.com/',\n        npm: 'jquery-mobile',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.mobile) {\n                return { version: jq.mobile.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'WebFont Loader': {\n        icon: 'icon_48',\n        url: 'https://github.com/typekit/webfontloader',\n        npm: 'webfontloader',\n        test: function(win) {\n            if(win.WebFont && win.WebFont.load) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Angular': {\n        icon: 'angular',\n        url: 'https://angular.io/',\n        npm: '@angular/core',\n        test: function(win) {\n            var ng = win.document.querySelector('[ng-version]');\n            if (ng) {\n                return { version: ng.getAttribute('ng-version') || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'AngularJS': {\n        icon: 'angularjs',\n        url: 'http://angularjs.org',\n        npm: 'angular',\n        test: function(win) {\n            var ng = win.angular;\n            if(ng && ng.version && ng.version.full) {\n                return { version: ng.version.full };\n            }\n            else if (ng) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js': {\n        icon: 'emberjs',\n        url: 'http://emberjs.com/',\n        npm: 'ember-source',\n        test: function(win) {\n            var ember = win.Ember || win.Em;\n            if (ember && ember.propertyDidChange) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Hammer.js': {\n        icon: 'hammerjs',\n        url: 'http://eightmedia.github.io/hammer.js/',\n        npm: 'hammerjs',\n        test: function(win) {\n            if(win.Hammer && win.Hammer.Pinch) {\n                // Hammer.VERSION available in 1.0.10+\n                return { version: win.Hammer.VERSION || \"&lt; 1.0.10\" };\n            }\n            return false;\n        }\n    },\n\n    'Visibility.js': {\n        icon: 'icon_48',\n        url: 'https://github.com/ai/visibilityjs',\n        npm: 'visibilityjs',\n        test: function(win) {\n            if(win.Visibility && win.Visibility.every) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Velocity.js': {\n        icon: 'icon_48',\n        url: 'http://velocityjs.org/',\n        npm: 'velocity-animate',\n        test: function(win) {\n            var jq = win.jQuery || win.$,\n                velocity = jq ? jq.Velocity : win.Velocity;\n\n            if(velocity && velocity.RegisterEffect && velocity.version) {\n                return {\n                    version:\n                        velocity.version.major + \".\" +\n                        velocity.version.minor + \".\" +\n                        velocity.version.patch\n                };\n            }\n            else if (velocity && velocity.RegisterEffect) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'IfVisible.js': {\n        icon: 'icon_48',\n        url: 'http://serkanyersen.github.io/ifvisible.js/',\n        npm: 'ifvisible.js',\n        test: function(win) {\n            var iv = win.ifvisible;\n            if(iv && iv.__ceGUID === \"ifvisible.object.event.identifier\") {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Pixi.js': {\n        icon: 'pixi',\n        url: 'https://github.com/GoodBoyDigital/pixi.js',\n        npm: 'pixi.js',\n        test: function(win) {\n            var px = win.PIXI;\n            if(px && px.WebGLRenderer && px.VERSION) {\n                // version 4.4.3 returns simply \"4.4.3\"; version 1.5.2 returns \"v1.5.2\"\n                return { version: px.VERSION.replace('v', '') || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'DC.js': {\n        icon: 'icon_48',\n        url: 'http://dc-js.github.io/dc.js/',\n        npm: 'dc',\n        test: function(win) {\n            var dc = win.dc;\n            if(dc && dc.registerChart) {\n                return { version: dc.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'GreenSock JS': {\n        icon: 'greensock',\n        url: 'https://github.com/greensock/GreenSock-JS',\n        npm: 'gsap',\n        test: function(win) {\n            if (win.TweenMax && win.TweenMax.pauseAll) {\n                return { version: win.TweenMax.version || UNKNOWN_VERSION }\n            }\n            return false;\n        }\n    },\n    'FastClick': {\n        icon: 'fastclick',\n        url: 'https://github.com/ftlabs/fastclick',\n        npm: 'fastclick',\n        test: function(win) {\n            if(win.FastClick && win.FastClick.notNeeded) {\n                return { version: UNKNOWN_VERSION }\n            }\n            return false;\n        }\n    },\n    'Isotope': {\n        icon: 'isotope',\n        url: 'http://isotope.metafizzy.co/',\n        npm: 'isotope-layout',\n        test: function(win) {\n            if(win.Isotope || (win.$ != null && win.$.Isotope)) {\n                return { version: UNKNOWN_VERSION }\n            }\n            return false;\n        }\n    },\n    'Marionette': {\n        icon: 'marionette',\n        url: 'http://marionettejs.com/',\n        npm: 'backbone.marionette',\n        test: function(win) {\n            if(win.Marionette && win.Marionette.Application) {\n                return { version: win.Marionette.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Can': {\n        icon: 'icon_48',\n        url: 'http://canjs.com/',\n        npm: 'can',\n        test: function (win) {\n            if (win.can && win.can.Construct) {\n                return { version: win.can.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue': {\n        icon: 'vue',\n        url: 'http://vuejs.org/',\n        npm: 'vue',\n        test: function(win) {\n            if (win.Vue && win.Vue.nextTick) {\n                return { version: win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Two': {\n        icon: 'two',\n        url: 'https://jonobr1.github.io/two.js',\n        npm: 'two.js',\n        test: function(win) {\n            if (win.Two && win.Two.Utils) {\n                return { version: win.Two.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Brewser': {\n        icon: 'brewser',\n        url: 'http://handcraftedldn.github.io/brewser/',\n        npm: 'brewser',\n        test: function(win) {\n            if(win.BREWSER && win.BREWSER.ua) {\n                return { version: BREWSER.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Material Design Lite': {\n    \ticon: 'mdl',\n    \turl: 'http://www.getmdl.io/',\n        npm: 'material-design-lite',\n    \ttest: function(win) {\n    \t\tif(win.componentHandler && win.componentHandler.upgradeElement) {\n    \t\t\treturn { version: UNKNOWN_VERSION};\n    \t\t}\n    \t\treturn false;\n    \t}\n    },\n    'Kendo UI': {\n        icon: 'kendoui',\n        url: 'https://github.com/telerik/kendo-ui-core',\n        npm: 'kendo-ui-core',\n        test: function(win) {\n            if (win.kendo && win.kendo.View && win.kendo.View.extend) {\n                return {version: win.kendo.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Matter.js': {\n        icon: 'matter-js',\n        url: 'http://brm.io/matter-js/',\n        npm: 'matter-js',\n        test: function(win) {\n            if (win.Matter && win.Matter.Engine) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Riot': {\n        icon: 'riot',\n        url: 'http://riotjs.com/',\n        npm: 'riot',\n        test: function(win) {\n            if (win.riot && win.riot.mixin) {\n                return { version: win.riot.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Sea.js': {\n        icon: 'icon_48',\n        url: 'http://seajs.org/',\n        npm: 'seajs',\n        test: function(win) {\n            if(win.seajs && win.seajs.use) {\n                return { version: win.seajs.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment.js': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/',\n        npm: 'moment',\n        test: function(win) {\n            if(win.moment && (win.moment.isMoment || win.moment.lang)) {\n                // version 1.0.0 has neither \"isMoment\" nor \"version\"\n                return { version: win.moment.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment Timezone': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/timezone/',\n        npm: 'moment-timezone',\n        test: function(win) {\n            if (win.moment && win.moment.tz) {\n                return { version: win.moment.tz.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'ScrollMagic': {\n        icon: 'scrollmagic',\n        url: 'http://scrollmagic.io/',\n        npm: 'scrollmagic',\n        test: function(win) {\n            if (win.ScrollMagic && win.ScrollMagic.Controller) {\n                return {version: ScrollMagic.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'SWFObject': {\n        icon: 'icon_48', // currently has no icon\n        url: 'https://github.com/swfobject/swfobject',\n        test: function(win) {\n            if (win.swfobject && win.swfobject.embedSWF) {\n                // 2.x - exact version only for 2.3\n                return { version: win.swfobject.version || UNKNOWN_VERSION };\n            } else if(win.deconcept && win.deconcept.SWFObject) {\n                // 1.x\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FlexSlider': {\n        icon: 'icon_48', // currently has no icon\n        url: 'https://woocommerce.com/flexslider/',\n        npm: 'flexslider',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if (jq && jq.fn && jq.fn.jquery && jq.flexslider){\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'SPF': {\n        icon: 'icon_48', // currently has no icon\n        url: 'https://youtube.github.io/spfjs/',\n        npm: 'spf',\n        test: function(win) {\n            if (win.spf && win.spf.init) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Numeral.js': {\n        icon: 'icon_48', // currently has no icon\n        url: 'http://numeraljs.com/',\n        npm: 'numeraljs',\n        test: function(win) {\n            if (win.numeral && win.isNumeral) {\n                return { version: win.numeral.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'boomerang.js': {\n        icon: 'icon_48', // currently has no icon\n        url: 'https://soasta.github.io/boomerang/doc/',\n        npm: 'boomerangjs',\n        test: function(win) {\n            if (win.BOOMR && win.BOOMR.utils && win.BOOMR.init) {\n                return { version: win.BOOMR.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Framer': {\n        icon: 'framer',\n        url: 'https://framer.com/',\n        npm: 'framerjs',\n        test: function(win) {\n            if (win.Framer && win.Framer.Layer) {\n                return { version: win.Framer.Version.build || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    }\n};\n";
+const libDetectorSource="var UNKNOWN_VERSION = null;\nvar d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests = {\n\n    'GWT': {\n        icon: 'gwt',\n        url: 'http://www.gwtproject.org/',\n        test: function(win) {\n            // pretty complicated, many possible tell tales\n            var doc = win.document,\n                hasHistFrame = doc.getElementById('__gwt_historyFrame'),\n                hasGwtUid = doc.gwt_uid,\n                hasBodyListener = doc.body.__listener,\n                hasBodyEventBits = doc.body.__eventBits,\n                hasModules = win.__gwt_activeModules,\n                hasJsonP = win.__gwt_jsonp__,\n                hasRootWinApp = win.__gwt_scriptsLoaded || win.__gwt_stylesLoaded || win.__gwt_activeModules;\n\n            // use the many possible indicators\n            if(hasHistFrame || hasGwtUid || hasBodyListener || hasBodyEventBits || hasModules || hasJsonP || hasRootWinApp) {\n\n                // carefully look at frames, but only if certain is GWT frame\n                var frames = doc.getElementsByTagName('iframe'),\n                    gwtVersion = UNKNOWN_VERSION;\n                for(var n=0; n<frames.length; n++) {\n                    // catch security access errors\n                    try {\n                        var hasNegativeTabIndex = frames[n].tabIndex < 0; // on for GWT\n                        if(hasNegativeTabIndex && frames[n].contentWindow && frames[n].contentWindow.$gwt_version) {\n                            gwtVersion = frames[n].contentWindow.$gwt_version;\n                            break;\n                        }\n                    }\n                    catch(e) {}\n                }\n\n                if(gwtVersion=='0.0.999') {\n                  gwtVersion = 'Google Internal';\n                }\n\n                return { version: gwtVersion };\n            }\n            return false;\n        }\n    },\n\n    'Ink': {\n        icon: 'ink',\n        url: 'http://ink.sapo.pt/',\n        test: function(win) {\n            if (win.Ink && win.Ink.createModule) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Vaadin': {\n        icon: 'vaadin',\n        url: 'https://vaadin.com/',\n        test: function(win) {\n            if (win.vaadin && win.vaadin.registerWidgetset) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Bootstrap': {\n        icon: 'bootstrap',\n        url: 'http://getbootstrap.com/',\n        npm: 'bootstrap',\n        // look for a function Boostrap has added to jQuery - regex for BS 2 & 3\n        test: function(win) {\n            var jQueryAvailable = win.$ && win.$.fn,\n                RE_PREFIX_V2 = '\\\\$this\\\\.data\\\\((?:\\'|\")',\n                RE_PREFIX_V3 = '\\\\$this\\\\.data\\\\((?:\\'|\")(?:bs\\\\.){1}',\n                bootstrapComponents = [\n                    'affix', 'alert', 'button', 'carousel', 'collapse', 'dropdown',\n                    'modal', 'popover', 'scrollspy', 'tab', 'tooltip'\n                ];\n\n            if(jQueryAvailable) {\n                var bootstrapVersion;\n\n                bootstrapComponents.some(function(component) {\n                    if(win.$.fn[component]) {\n                        // Bootstrap >= 3.2.0 detection\n                        if(win.$.fn[component].Constructor && win.$.fn[component].Constructor.VERSION) {\n                            bootstrapVersion = win.$.fn[component].Constructor.VERSION;\n                            return true;\n                        // Bootstrap >= 2.0.0 and <= 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V3 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 3.0.0 & <= 3.1.1';\n                            return true;\n                        // Bootstrap < 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V2 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 2.0.0 & <= 2.3.2';\n                            return true;\n                        }\n                    }\n\n                    return false;\n                });\n\n                if (bootstrapVersion) {\n                    return { version: bootstrapVersion };\n                }\n            }\n\n            return false;\n        }\n    },\n\n    'Zurb': {\n        icon: 'zurb',\n        url: 'https://foundation.zurb.com/',\n        npm: 'foundation-sites',\n        test: function(win) {\n            if(win.Foundation && win.Foundation.Toggler) {\n                return { version: win.Foundation.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Polymer': {\n        icon: 'polymer',\n        url: 'https://www.polymer-project.org/',\n        npm: '@polymer/polymer',\n        test: function(win) {\n            if(win.Polymer && win.Polymer.dom) {\n                return { version: win.Polymer.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Highcharts': {\n        icon: 'highcharts',\n        url: 'http://www.highcharts.com',\n        npm: 'highcharts',\n        test: function(win) {\n            if(win.Highcharts && win.Highcharts.Point) {\n                return { version: win.Highcharts.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'InfoVis': {\n        icon: 'jit',\n        url: 'http://philogb.github.com/jit/',\n        test: function test(win) {\n            if(win.$jit && win.$jit.PieChart) {\n                return { version: win.$jit.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'FlotCharts': {\n        icon: 'flotcharts',\n        url: 'http://www.flotcharts.org/',\n        npm: 'flot',\n        test: function(win) {\n            if(win.$ && win.$.plot) {\n                return { version: win.$.plot.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'CreateJS': {\n        icon: 'createjs',\n        url: 'https://createjs.com/',\n        npm: 'createjs',\n        test: function(win) {\n            if(win.createjs && win.createjs.promote) {\n                return { version: UNKNOWN_VERSION}; // no version info available\n            }\n            return false;\n        }\n    },\n\n    'Google Maps': {\n        icon: 'gmaps',\n        url: 'https://developers.google.com/maps/',\n        test: function(win) {\n            if (win.google && win.google.maps) {\n                return { version: win.google.maps.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function(win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn) {\n                return { version: jq.fn.jquery.replace(/[^\\d+\\.+]/g, '') || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery UI': {\n        icon: 'jquery_ui',\n        url: 'http://jqueryui.com',\n        npm: 'jquery-ui',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.ui) {\n                var plugins = 'accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs'.split(','), concat = [];\n                for (var i=0; i < plugins.length; i++) { if(jq.ui[plugins[i]]) concat.push(plugins[i].substr(0,1).toUpperCase() + plugins[i].substr(1)); }\n                return { version: jq.ui.version || UNKNOWN_VERSION, details: concat.length ? 'Plugins used: '+concat.join(',') : '' };\n            }\n            return false;\n        }\n    },\n\n    'Dojo': {\n        icon: 'dojo',\n        url: 'http://dojotoolkit.org',\n        npm: 'dojo',\n        test: function(win) {\n            if(win.dojo && win.dojo.delegate) {\n                var version = win.dojo.version ? win.dojo.version.toString() : UNKNOWN_VERSION;\n                return { version: version, details: 'Details: '+(win.dijit ? 'Uses Dijit' : 'none') };\n            }\n            return false;\n        }\n    },\n\n    'Prototype': {\n        icon: 'prototype',\n        url: 'http://prototypejs.org',\n        test: function(win) {\n            if(win.Prototype && win.Prototype.BrowserFeatures) {\n                return { version: win.Prototype.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Scriptaculous': {\n        icon: 'scriptaculous',\n        url: 'http://script.aculo.us',\n        test: function(win) {\n            if(win.Scriptaculous && win.Scriptaculous.load) {\n                return { version: win.Scriptaculous.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'MooTools': {\n        icon: 'mootools',\n        url: 'https://mootools.net/',\n        test: function(win) {\n            if(win.MooTools && win.MooTools.build) {\n                return { version: win.MooTools.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spry': {\n        icon: 'spry',\n        url: 'http://labs.adobe.com/technologies/spry',\n        test: function(win) {\n            if (win.Spry && win.Spry.Data) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 2': {\n        icon: 'yui',\n        url: 'http://developer.yahoo.com/yui/2/',\n        test: function(win) {\n            if (win.YAHOO && win.YAHOO.util) {\n                return { version: win.YAHOO.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 3': {\n        icon: 'yui3',\n        url: 'https://yuilibrary.com/',\n        npm: 'yui',\n        test: function(win) {\n            if (win.YUI && win.YUI.Env) {\n                return { version: win.YUI.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Qooxdoo': {\n        icon: 'qooxdoo',\n        url: 'http://www.qooxdoo.org/',\n        npm: 'qooxdoo',\n        test: function(win) {\n            if(win.qx && win.qx.Bootstrap) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ext JS': {\n        icon: 'extjs',\n        url: 'https://www.sencha.com/products/extjs/',\n        test: function(win) {\n            if (win.Ext && win.Ext.versions) {\n                return { version: win.Ext.versions.core.version };\n            }\n            else if(win.Ext) {\n                return { version: win.Ext.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'base2': {\n        icon: 'base2',\n        url: 'http://code.google.com/p/base2',\n        test: function(win) {\n            if(win.base2 && win.base2.dom) {\n                return { version: win.base2.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Closure Library': {\n        icon: 'closure',\n        url: 'https://developers.google.com/closure/library/',\n        npm: 'google-closure-library',\n        test: function(win) {\n            if(win.goog && win.goog.provide) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Rapha&euml;l': {\n        icon: 'raphael',\n        url: 'http://dmitrybaranovskiy.github.io/raphael/',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.circle) {\n                return { version: win.Raphael.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React': {\n        icon: 'react',\n        url: 'https://reactjs.org/',\n        npm: 'react',\n        test: function(win) {\n            function isReactNode(node) {\n                return node._reactRootContainer!=null;\n            }\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            var bodyReactRoot = isReactNode(document.body) || isReactNode(document.body.firstElementChild || {});\n            var hasReactRoot = bodyReactRoot|| document.createTreeWalker(document.body, 3, isReactNode).nextNode() != null;\n            if (hasReactRoot || reactRoot && reactRoot.innerText.length > 0 || altHasReact || win.React && win.React.Component) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Preact': {\n        icon: 'preact',\n        url: 'https://preactjs.com/',\n        npm: 'preact',\n        test: function(win) {\n            var expando = typeof Symbol!='undefined' && Symbol.for && Symbol.for('preactattr');\n            function isPreactNode(node) {\n                if (node._component!=null || node.__preactattr_!=null || expando && node[expando]!=null) {\n                    return node;\n                }\n                return null;\n            }\n            var preactRoot = isPreactNode(document.body) || isPreactNode(document.body.firstElementChild || {});\n            if (!preactRoot) {\n                preactRoot = document.createTreeWalker(document.body, 3, isPreactNode).nextNode();\n            }\n            if (preactRoot || win.preact) {\n                var version = UNKNOWN_VERSION;\n                if (expando && preactRoot && preactRoot[expando]!=null) {\n                    version = '7';\n                }\n                return { version: version };\n            }\n            return false;\n        }\n    },\n\n    'Modernizr': {\n        icon: 'modernizr',\n        url: 'https://modernizr.com/',\n        npm: 'modernizr',\n        test: function(win) {\n            if (win.Modernizr && win.Modernizr.addTest) {\n                return { version: win.Modernizr._version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Processing.js': {\n        icon: 'processingjs',\n        url: 'http://processingjs.org',\n        npm: 'processing-js',\n        test: function(win) {\n            if(win.Processing && win.Processing.box) {\n                return { version: Processing.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Backbone': {\n        icon: 'backbone',\n        url: 'http://backbonejs.org/',\n        npm: 'backbone',\n        test: function(win) {\n            if (win.Backbone && win.Backbone.Model.extend) {\n                return {version: win.Backbone.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Leaflet': {\n        icon: 'leaflet',\n        url: 'http://leafletjs.com',\n        npm: 'leaflet',\n        test: function(win) {\n            // Leaflet 3.1 uses L.Marker and L.VERSION; later versions use L.marker and L.version\n            if (win.L && win.L.GeoJSON && (win.L.marker || win.L.Marker)) {\n                return { version: win.L.version || win.L.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Mapbox': {\n        icon: 'mapbox',\n        url: 'https://www.mapbox.com/',\n        npm: 'mapbox-gl',\n        test: function(win) {\n            if (win.L && win.L.mapbox && win.L.mapbox.geocoder) {\n                return { version: win.L.mapbox.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Lo-Dash': {\n        icon: 'lodash',\n        url: 'https://lodash.com/',\n        npm: 'lodash',\n        test: function(win) {\n            var _ = typeof (_ = win._) == 'function' && _,\n                chain = typeof (chain = _ && _.chain) == 'function' && chain,\n                wrapper = (chain || _ || function() { return {}; })(1);\n\n            if (_ && wrapper.__wrapped__) {\n                return { version: _.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Underscore': {\n        icon: 'underscore',\n        url: 'http://underscorejs.org/',\n        npm: 'underscore',\n        test: function(win) {\n            if (win._ && typeof win._.tap === 'function' &&\n                !d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests['Lo-Dash'].test(win)) {\n                return {version: win._.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Sammy': {\n        icon: 'sammy',\n        url: 'http://sammyjs.org',\n        test: function(win) {\n            if (win.Sammy && win.Sammy.Application.curry) {\n                return {version: win.Sammy.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Rico': {\n        icon: 'rico',\n        url: 'http://openrico.sourceforge.net/examples/index.html',\n        test:  function(win) {\n            if (win.Rico && window.Rico.checkIfComplete) {\n                return {version: win.Rico.Version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'MochiKit': {\n        icon: 'mochikit',\n        url: 'https://mochi.github.io/mochikit/',\n        test: function(win) {\n            if (win.MochiKit && win.MochiKit.Base.module) {\n                return {version: MochiKit.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'gRapha&euml;l': {\n        icon: 'graphael',\n        url: 'https://github.com/DmitryBaranovskiy/g.raphael',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.fn.g) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Glow': {\n        icon: 'glow',\n        url: 'http://www.bbc.co.uk/glow/',\n        test: function(win) {\n            if (win.gloader && win.gloader.getRequests) {\n                return {version: UNKNOWN_VERSION};\n            }\n            else if (win.glow && win.glow.dom) {\n                return {version: win.glow.VERSION || UNKNOWN_VERSION};\n            }\n            else if (win.Glow) {\n                return {version: win.Glow.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Socket.IO': {\n        icon: 'socketio', // currently has no icon\n        url: 'https://socket.io/',\n        npm: 'socket.io',\n        test: function(win) {\n            // version 0.6.2 uses only io.Socket; more recent versions also have io.sockets\n            if (win.io && (win.io.sockets || win.io.Socket)) {\n                return {version: win.io.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Mustache': {\n        icon: 'mustache',\n        url: 'http://mustache.github.io/',\n        npm: 'mustache',\n        test: function(win) {\n            if (win.Mustache && win.Mustache.to_html) {\n                return {version: win.Mustache.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Fabric.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://fabricjs.com/',\n        npm: 'fabric',\n        test: function(win) {\n            if (win.fabric && win.fabric.util) {\n                return {version: win.fabric.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'FuseJS': {\n        icon: 'fusejs',\n        url: 'http://fusejs.io/',\n        npm: 'fuse.js',\n        test: function(win) {\n            if (win.Fuse) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Tween.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/tweenjs/tween.js',\n        npm: 'tween.js',\n        test: function(win) {\n            if (win.TWEEN && win.TWEEN.Easing) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'SproutCore': {\n       icon: 'sproutcore',\n       url: 'http://sproutcore.com/',\n       test: function(win) {\n           if (win.SC && win.SC.Application) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'Zepto.js': {\n       icon: 'zepto',\n       url: 'http://zeptojs.com',\n       npm: 'zepto',\n       test: function(win) {\n           if (win.Zepto && win.Zepto.fn) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'three.js': {\n       icon: 'icon38', // currently has no icon\n       url: 'https://threejs.org/',\n       npm: 'three',\n       test: function(win) {\n           if (win.THREE && win.THREE.REVISION) {\n               return {version: 'r' + win.THREE.REVISION};\n           }\n           else if (win.THREE) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'PhiloGL': {\n       icon: 'philogl',\n       url: 'http://www.senchalabs.org/philogl/',\n       npm: 'philogl',\n       test: function(win) {\n           if (win.PhiloGL && win.PhiloGL.Camera) {\n               return {version: win.PhiloGL.version || UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'CamanJS': {\n        icon: 'camanjs',\n        url: 'http://camanjs.com/',\n        npm: 'caman',\n        test: function(win) {\n            if (win.Caman && win.Caman.version) {\n                return {version: win.Caman.version.release};\n            }\n            else if (win.Caman) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'yepnope': {\n        icon: 'yepnope',\n        url: 'http://yepnopejs.com/',\n        test: function(win) {\n            if (win.yepnope && win.yepnope.injectJs) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'LABjs': {\n        icon: 'icon38',\n        url: 'https://github.com/getify/LABjs',\n        test: function(win) {\n            if (win.$LAB && win.$LAB.setOptions) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Head JS': {\n        icon: 'headjs',\n        url: 'http://headjs.com/',\n        npm: 'headjs',\n        test: function(win) {\n            if (win.head && win.head.js) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'ControlJS': {\n        icon: 'icon38',\n        url: 'http://stevesouders.com/controljs/',\n        test: function(win) {\n            if (win.CJS && win.CJS.start) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'RequireJS': {\n        icon: 'requirejs',\n        url: 'http://requirejs.org/',\n        npm: 'requirejs',\n        test: function(win) {\n            var req = win.require || win.requirejs;\n            if (req && (req.load || (req.s && req.s.contexts && req.s.contexts._ && (req.s.contexts._.loaded || req.s.contexts._.load)))) {\n                return { version: req.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'RightJS': {\n        icon: 'rightjs',\n        url: 'http://rightjs.org/',\n        test: function(win) {\n            if (win.RightJS && win.RightJS.isNode) {\n                return { version: win.RightJS.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery Tools': {\n       icon: 'jquerytools',\n       url: 'http://jquerytools.github.io/',\n       test: function(win) {\n            var jq = win.jQuery || win.$;\n            if(jq && jq.tools) {\n               return { version: jq.tools.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Pusher': {\n       icon: 'pusher',\n       url: 'https://pusher.com/docs/',\n       npm: 'pusher-js',\n       test: function(win) {\n            if(win.Pusher && win.Pusher.Channel) {\n               return { version: win.Pusher.VERSION || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Paper.js': {\n       icon: 'paperjs',\n       url: 'http://paperjs.org/',\n       npm: 'paper',\n       test: function(win) {\n            if(win.paper && win.paper.Point) {\n               return { version: win.paper.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Swiffy': {\n       icon: 'icon38',\n       url: 'https://developers.google.com/swiffy/',\n       test: function(win) {\n            if(win.swiffy && win.swiffy.Stage) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Move': {\n       icon: 'move',\n       url: 'https://github.com/rsms/move',\n       npm: 'move',\n       test: function(win) {\n            if(win.move && win.move.compile) {\n               return { version: win.move.version() || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'AmplifyJS': {\n       icon: 'amplifyjs',\n       url: 'http://amplifyjs.com/',\n       npm: 'amplifyjs',\n       test: function(win) {\n            if(win.amplify && win.amplify.publish) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Popcorn.js': {\n       icon: 'popcornjs',\n       url: 'https://github.com/mozilla/popcorn-js/',\n       test: function(win) {\n            if (win.Popcorn && win.Popcorn.Events) {\n               return { version: win.Popcorn.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'D3': {\n        icon: 'd3',\n        url: 'https://d3js.org/',\n        npm: 'd3',\n        test: function(win) {\n            if (win.d3 && win.d3.select) {\n                return { version: win.d3.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Handlebars': {\n        icon: 'handlebars',\n        url: 'http://handlebarsjs.com/',\n        npm: 'handlebars',\n        test: function(win) {\n            if(win.Handlebars && win.Handlebars.compile) {\n                return { version: win.Handlebars.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Knockout': {\n        icon: 'knockout',\n        url: 'http://knockoutjs.com/',\n        npm: 'knockout',\n        test: function(win) {\n            if (win.ko && win.ko.applyBindings) {\n                return { version: win.ko.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spine': {\n        icon: 'icon38',\n        url: 'http://spine.github.io/',\n        test: function(win) {\n            if (win.Spine && win.Spine.Controller) {\n                return {version: win.Spine.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery Mobile': {\n        icon: 'jquery_mobile',\n        url: 'http://jquerymobile.com/',\n        npm: 'jquery-mobile',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.mobile) {\n                return { version: jq.mobile.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'WebFont Loader': {\n        icon: 'icon38',\n        url: 'https://github.com/typekit/webfontloader',\n        npm: 'webfontloader',\n        test: function(win) {\n            if(win.WebFont && win.WebFont.load) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Angular': {\n        icon: 'angular',\n        url: 'https://angular.io/',\n        npm: '@angular/core',\n        test: function(win) {\n            var ng = win.document.querySelector('[ng-version]');\n            if (ng) {\n                return { version: ng.getAttribute('ng-version') || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'AngularJS': {\n        icon: 'angularjs',\n        url: 'https://angularjs.org/',\n        npm: 'angular',\n        test: function(win) {\n            var ng = win.angular;\n            if(ng && ng.version && ng.version.full) {\n                return { version: ng.version.full };\n            }\n            else if (ng) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js': {\n        icon: 'emberjs',\n        url: 'https://emberjs.com/',\n        npm: 'ember-source',\n        test: function(win) {\n            var ember = win.Ember || win.Em;\n            if (ember && ember.propertyDidChange) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Hammer.js': {\n        icon: 'hammerjs',\n        url: 'http://eightmedia.github.io/hammer.js/',\n        npm: 'hammerjs',\n        test: function(win) {\n            if(win.Hammer && win.Hammer.Pinch) {\n                // Hammer.VERSION available in 1.0.10+\n                return { version: win.Hammer.VERSION || \"&lt; 1.0.10\" };\n            }\n            return false;\n        }\n    },\n\n    'Visibility.js': {\n        icon: 'icon38',\n        url: 'https://github.com/ai/visibilityjs',\n        npm: 'visibilityjs',\n        test: function(win) {\n            if(win.Visibility && win.Visibility.every) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Velocity.js': {\n        icon: 'icon38',\n        url: 'http://velocityjs.org/',\n        npm: 'velocity-animate',\n        test: function(win) {\n            var jq = win.jQuery || win.$,\n                velocity = jq ? jq.Velocity : win.Velocity;\n\n            if(velocity && velocity.RegisterEffect && velocity.version) {\n                return {\n                    version:\n                        velocity.version.major + \".\" +\n                        velocity.version.minor + \".\" +\n                        velocity.version.patch\n                };\n            }\n            else if (velocity && velocity.RegisterEffect) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'IfVisible.js': {\n        icon: 'icon38',\n        url: 'http://serkanyersen.github.io/ifvisible.js/',\n        npm: 'ifvisible.js',\n        test: function(win) {\n            var iv = win.ifvisible;\n            if(iv && iv.__ceGUID === \"ifvisible.object.event.identifier\") {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Pixi.js': {\n        icon: 'pixi',\n        url: 'http://www.pixijs.com/',\n        npm: 'pixi.js',\n        test: function(win) {\n            var px = win.PIXI;\n            if(px && px.WebGLRenderer && px.VERSION) {\n                // version 4.4.3 returns simply \"4.4.3\"; version 1.5.2 returns \"v1.5.2\"\n                return { version: px.VERSION.replace('v', '') || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'DC.js': {\n        icon: 'dcjs',\n        url: 'http://dc-js.github.io/dc.js/',\n        npm: 'dc',\n        test: function(win) {\n            var dc = win.dc;\n            if(dc && dc.registerChart) {\n                return { version: dc.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'GreenSock JS': {\n        icon: 'greensock',\n        url: 'https://greensock.com/gsap',\n        npm: 'gsap',\n        test: function(win) {\n            if (win.TweenMax && win.TweenMax.pauseAll) {\n                return { version: win.TweenMax.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FastClick': {\n        icon: 'fastclick',\n        url: 'https://github.com/ftlabs/fastclick',\n        npm: 'fastclick',\n        test: function(win) {\n            if(win.FastClick && win.FastClick.notNeeded) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Isotope': {\n        icon: 'isotope',\n        url: 'https://isotope.metafizzy.co/',\n        npm: 'isotope-layout',\n        test: function(win) {\n            if(win.Isotope || (win.$ != null && win.$.Isotope)) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marionette': {\n        icon: 'marionette',\n        url: 'https://marionettejs.com/',\n        npm: 'backbone.marionette',\n        test: function(win) {\n            if(win.Marionette && win.Marionette.Application) {\n                return { version: win.Marionette.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Can': {\n        icon: 'canjs',\n        url: 'https://canjs.com/',\n        npm: 'can',\n        test: function (win) {\n            if (win.can && win.can.Construct) {\n                return { version: win.can.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue': {\n        icon: 'vue',\n        url: 'https://vuejs.org/',\n        npm: 'vue',\n        test: function(win) {\n            if (win.Vue && win.Vue.nextTick) {\n                return { version: win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Two': {\n        icon: 'two',\n        url: 'https://two.js.org/',\n        npm: 'two.js',\n        test: function(win) {\n            if (win.Two && win.Two.Utils) {\n                return { version: win.Two.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Brewser': {\n        icon: 'brewser',\n        url: 'https://robertpataki.github.io/brewser/',\n        npm: 'brewser',\n        test: function(win) {\n            if(win.BREWSER && win.BREWSER.ua) {\n                return { version: BREWSER.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Material Design Lite': {\n        icon: 'mdl',\n        url: 'https://getmdl.io/',\n        npm: 'material-design-lite',\n        test: function(win) {\n            if(win.componentHandler && win.componentHandler.upgradeElement) {\n                return { version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Kendo UI': {\n        icon: 'kendoui',\n        url: 'https://github.com/telerik/kendo-ui-core',\n        npm: 'kendo-ui-core',\n        test: function(win) {\n            if (win.kendo && win.kendo.View && win.kendo.View.extend) {\n                return {version: win.kendo.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Matter.js': {\n        icon: 'matter-js',\n        url: 'http://brm.io/matter-js/',\n        npm: 'matter-js',\n        test: function(win) {\n            if (win.Matter && win.Matter.Engine) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Riot': {\n        icon: 'riot',\n        url: 'http://riotjs.com/',\n        npm: 'riot',\n        test: function(win) {\n            if (win.riot && win.riot.mixin) {\n                return { version: win.riot.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Sea.js': {\n        icon: 'icon38',\n        url: 'https://seajs.github.io/seajs/docs/',\n        npm: 'seajs',\n        test: function(win) {\n            if(win.seajs && win.seajs.use) {\n                return { version: win.seajs.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment.js': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/',\n        npm: 'moment',\n        test: function(win) {\n            if(win.moment && (win.moment.isMoment || win.moment.lang)) {\n                // version 1.0.0 has neither \"isMoment\" nor \"version\"\n                return { version: win.moment.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment Timezone': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/timezone/',\n        npm: 'moment-timezone',\n        test: function(win) {\n            if (win.moment && win.moment.tz) {\n                return { version: win.moment.tz.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'ScrollMagic': {\n        icon: 'scrollmagic',\n        url: 'http://scrollmagic.io/',\n        npm: 'scrollmagic',\n        test: function(win) {\n            if (win.ScrollMagic && win.ScrollMagic.Controller) {\n                return {version: ScrollMagic.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'SWFObject': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/swfobject/swfobject',\n        test: function(win) {\n            if (win.swfobject && win.swfobject.embedSWF) {\n                // 2.x - exact version only for 2.3\n                return { version: win.swfobject.version || UNKNOWN_VERSION };\n            } else if(win.deconcept && win.deconcept.SWFObject) {\n                // 1.x\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FlexSlider': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://woocommerce.com/flexslider/',\n        npm: 'flexslider',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if (jq && jq.fn && jq.fn.jquery && jq.flexslider){\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'SPF': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://youtube.github.io/spfjs/',\n        npm: 'spf',\n        test: function(win) {\n            if (win.spf && win.spf.init) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Numeral.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://numeraljs.com/',\n        npm: 'numeraljs',\n        test: function(win) {\n            if (win.numeral && win.isNumeral) {\n                return { version: win.numeral.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'boomerang.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://soasta.github.io/boomerang/',\n        npm: 'boomerangjs',\n        test: function(win) {\n            if (win.BOOMR && win.BOOMR.utils && win.BOOMR.init) {\n                return { version: win.BOOMR.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Framer': {\n        icon: 'framer',\n        url: 'https://framer.com/',\n        npm: 'framerjs',\n        test: function(win) {\n            if (win.Framer && win.Framer.Layer) {\n                return { version: win.Framer.Version.build || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marko': {\n        icon: 'marko',\n        url: 'https://markojs.com/',\n        npm: 'marko',\n        test: function (win) {\n            var selector = '[data-marko-key], [data-marko]';\n            var markoElement = document.querySelector(selector);\n            if (markoElement) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'AMP': {\n        icon: 'amp',\n        url: 'https://ampproject.org/',\n        npm: null,\n        test: function (win) {\n            var version = win.document.documentElement.getAttribute(\"amp-version\");\n            return version ? { version: version } : false;\n        }\n    },\n    'Workbox': {\n      icon: 'workbox',\n      url: 'https://developers.google.com/web/tools/workbox/',\n      npm: 'workbox-sw',\n      test: async function (win) {\n        var nav = win.navigator;\n        // Service Workers not supported\n        if (!('serviceWorker' in nav)) {\n          return false;\n        }\n        return nav.serviceWorker.getRegistration()\n        .then(function(registration) {\n          var scriptURL = nav.serviceWorker.controller.scriptURL;\n          return fetch(scriptURL, { credentials: 'include',\n            headers: { 'service-worker': 'script' }\n          })\n          .then(function(response) {\n            return response.text();\n          })\n          .then(function(scriptContent) {\n            var workboxRegExp = /new Workbox|new workbox|workbox\\.precaching\\.|workbox\\.strategies/gm;\n            if (workboxRegExp.test(scriptContent)) {\n              // Adapted from\n              // https://github.com/semver/semver/issues/232#issue-48635632\n              var semVerRegExp = /workbox.*?\\b((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?)\\b/gim;\n              var matches = semVerRegExp.exec(scriptContent);\n              var version = UNKNOWN_VERSION;\n              if (Array.isArray(matches) && matches.length > 1 && matches[1]) {\n                version = matches[1];\n              }\n              return { version: version };\n            }\n            return false;\n          });\n        }).catch(function(exception) {\n          return false;\n        });\n      }\n    }\n};\n";
 
 
 
@@ -9893,7 +10462,7 @@
 
 module.exports=JSLibraries;
 
-},{"../gatherer":19}],"../gather/gatherers/dobetterweb/optimized-images":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/dobetterweb/optimized-images":[function(require,module,exports){
 
 
 
@@ -9917,6 +10486,8 @@
 
 const MINIMUM_IMAGE_SIZE=4096;
 
+const IMAGE_REGEX=/^image\/((x|ms|x-ms)-)?(png|bmp|jpeg)$/;
+
 
 
 
@@ -9983,7 +10554,7 @@
 
 seenUrls.add(record.url);
 const isOptimizableImage=record.resourceType===NetworkRequest.TYPES.Image&&
-/image\/(png|bmp|jpeg)/.test(record.mimeType);
+IMAGE_REGEX.test(record.mimeType);
 const isSameOrigin=URL.originsMatch(pageUrl,record.url);
 const isBase64DataUri=/^data:.{2,40}base64\s*,/.test(record.url);
 
@@ -10088,7 +10659,6 @@
 }catch(err){
 
 
-
 Sentry.captureException(err,{
 tags:{gatherer:'OptimizedImages'},
 extra:{imageUrl:URL.elideDataURI(record.url)},
@@ -10128,7 +10698,7 @@
 
 module.exports=OptimizedImages;
 
-},{"../../../lib/network-request":38,"../../../lib/sentry":40,"../../../lib/url-shim":"url","../../driver.js":17,"../gatherer":19}],"../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste":[function(require,module,exports){
+},{"../../../lib/network-request":88,"../../../lib/sentry":90,"../../../lib/url-shim":"url","../../driver.js":19,"../gatherer":21}],"../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste":[function(require,module,exports){
 
 
 
@@ -10139,6 +10709,7 @@
 
 
 const Gatherer=require('../gatherer');
+const pageFunctions=require('../../../lib/page-functions');
 
 
 
@@ -10146,18 +10717,6 @@
 
 
 function findPasswordInputsWithPreventedPaste(){
-
-
-
-
-
-function getOuterHTMLSnippet(element){
-const reOpeningTag=/^.*?>/;
-const match=element.outerHTML.match(reOpeningTag);
-
-return match&&match[0];
-}
-
 return Array.from(document.querySelectorAll('input[type="password"]')).
 filter(passwordInput=>
 !passwordInput.dispatchEvent(
@@ -10165,6 +10724,7 @@
 
 
 map(passwordInput=>({
+
 snippet:getOuterHTMLSnippet(passwordInput)}));
 
 }
@@ -10175,16 +10735,17 @@
 
 
 afterPass(passContext){
-return passContext.driver.evaluateAsync(
-`(${findPasswordInputsWithPreventedPaste.toString()}())`);
-
+return passContext.driver.evaluateAsync(`(() => {
+      ${pageFunctions.getOuterHTMLSnippetString};
+      return (${findPasswordInputsWithPreventedPaste.toString()}());
+    })()`);
 }}
 
 
 
 module.exports=PasswordInputsWithPreventedPaste;
 
-},{"../gatherer":19}],"../gather/gatherers/dobetterweb/response-compression":[function(require,module,exports){
+},{"../../../lib/page-functions":89,"../gatherer":21}],"../gather/gatherers/dobetterweb/response-compression":[function(require,module,exports){
 (function(Buffer){
 
 
@@ -10208,6 +10769,7 @@
 const compressionHeaders=['content-encoding','x-original-content-encoding'];
 const compressionTypes=['gzip','br','deflate'];
 const binaryMimeTypes=['image','audio','video'];
+
 const textResourceTypes=[
 NetworkRequest.TYPES.Document,
 NetworkRequest.TYPES.Script,
@@ -10290,7 +10852,6 @@
 });
 });
 }).catch(err=>{
-
 Sentry.captureException(err,{
 tags:{gatherer:'ResponseCompression'},
 extra:{url:URL.elideDataURI(record.url)},
@@ -10307,7 +10868,7 @@
 module.exports=ResponseCompression;
 
 }).call(this,require("buffer").Buffer);
-},{"../../../lib/network-request":38,"../../../lib/sentry":40,"../../../lib/url-shim":"url","../gatherer":19,"buffer":60,"zlib":57}],"../gather/gatherers/dobetterweb/tags-blocking-first-paint":[function(require,module,exports){
+},{"../../../lib/network-request":88,"../../../lib/sentry":90,"../../../lib/url-shim":"url","../gatherer":21,"buffer":109,"zlib":106}],"../gather/gatherers/dobetterweb/tags-blocking-first-paint":[function(require,module,exports){
 
 
 
@@ -10499,7 +11060,7 @@
 
 module.exports=TagsBlockingFirstPaint;
 
-},{"../../driver.js":17,"../gatherer":19}],"../gather/gatherers/dobetterweb/websql":[function(require,module,exports){
+},{"../../driver.js":19,"../gatherer":21}],"../gather/gatherers/dobetterweb/websql":[function(require,module,exports){
 
 
 
@@ -10553,7 +11114,7 @@
 
 module.exports=WebSQL;
 
-},{"../../driver.js":17,"../gatherer":19}],"../gather/gatherers/fonts":[function(require,module,exports){
+},{"../../driver.js":19,"../gatherer":21}],"../gather/gatherers/fonts":[function(require,module,exports){
 
 
 
@@ -10767,18 +11328,18 @@
 return fontData.then(([loadedFonts,fontsAndErrors])=>{
 
 const fontFaces=fontsAndErrors.filter(
-fontOrError=>{
+fontOrError=>!('err'in fontOrError));
 
-const dataError=fontOrError;
+const firstFontError=fontsAndErrors.find(fontOrError=>'err'in fontOrError);
+if(firstFontError){
+
+const dataError=firstFontError;
 if(dataError.err){
 const err=new Error(dataError.err.message);
 err.stack=dataError.err.stack||err.stack;
-
 Sentry.captureException(err,{tags:{gatherer:'Fonts'},level:'warning'});
-return false;
 }
-return true;
-});
+}
 
 return loadedFonts.map(loadedFont=>{
 const fontFaceItem=this._findSameFontFamily(loadedFont,fontFaces);
@@ -10792,7 +11353,7 @@
 
 module.exports=Fonts;
 
-},{"../../lib/sentry":40,"./gatherer":19}],"../gather/gatherers/html-without-javascript":[function(require,module,exports){
+},{"../../lib/sentry":90,"./gatherer":21}],"../gather/gatherers/html-without-javascript":[function(require,module,exports){
 
 
 
@@ -10850,7 +11411,7 @@
 
 module.exports=HTMLWithoutJavaScript;
 
-},{"./gatherer":19}],"../gather/gatherers/http-redirect":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/http-redirect":[function(require,module,exports){
 
 
 
@@ -10897,7 +11458,7 @@
 
 module.exports=HTTPRedirect;
 
-},{"./gatherer":19}],"../gather/gatherers/image-usage":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/image-usage":[function(require,module,exports){
 
 
 
@@ -10910,7 +11471,7 @@
 'use strict';
 
 const Gatherer=require('./gatherer');
-const DOMHelpers=require('../../lib/dom-helpers.js');
+const pageFunctions=require('../../lib/page-functions.js');
 const Driver=require('../driver.js');
 
 
@@ -11061,7 +11622,7 @@
 },{});
 
 const expression=`(function() {
-      ${DOMHelpers.getElementsInDocumentFnString}; // define function on page
+      ${pageFunctions.getElementsInDocumentString}; // define function on page
       return (${collectImageElementInfo.toString()})();
     })()`;
 
@@ -11089,7 +11650,7 @@
 
 module.exports=ImageUsage;
 
-},{"../../lib/dom-helpers.js":30,"../driver.js":17,"./gatherer":19}],"../gather/gatherers/js-usage":[function(require,module,exports){
+},{"../../lib/page-functions.js":89,"../driver.js":19,"./gatherer":21}],"../gather/gatherers/js-usage":[function(require,module,exports){
 
 
 
@@ -11127,7 +11688,7 @@
 
 module.exports=JsUsage;
 
-},{"./gatherer":19}],"../gather/gatherers/manifest":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/manifest":[function(require,module,exports){
 (function(Buffer){
 
 
@@ -11177,7 +11738,7 @@
 module.exports=Manifest;
 
 }).call(this,require("buffer").Buffer);
-},{"../../lib/manifest-parser":36,"./gatherer":19,"buffer":60}],"../gather/gatherers/mixed-content":[function(require,module,exports){
+},{"../../lib/manifest-parser":86,"./gatherer":21,"buffer":109}],"../gather/gatherers/mixed-content":[function(require,module,exports){
 (function(Buffer){
 
 
@@ -11301,7 +11862,7 @@
 module.exports=MixedContent;
 
 }).call(this,require("buffer").Buffer);
-},{"../../lib/url-shim":"url","../driver.js":17,"./gatherer":19,"buffer":60}],"../gather/gatherers/offline":[function(require,module,exports){
+},{"../../lib/url-shim":"url","../driver.js":19,"./gatherer":21,"buffer":109}],"../gather/gatherers/offline":[function(require,module,exports){
 
 
 
@@ -11338,7 +11899,7 @@
 
 module.exports=Offline;
 
-},{"../../lib/url-shim":"url","./gatherer":19}],"../gather/gatherers/runtime-exceptions":[function(require,module,exports){
+},{"../../lib/url-shim":"url","./gatherer":21}],"../gather/gatherers/runtime-exceptions":[function(require,module,exports){
 
 
 
@@ -11388,7 +11949,7 @@
 
 module.exports=RuntimeExceptions;
 
-},{"./gatherer":19}],"../gather/gatherers/scripts":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/scripts":[function(require,module,exports){
 
 
 
@@ -11431,7 +11992,7 @@
 
 module.exports=Scripts;
 
-},{"../../lib/network-request":38,"./gatherer":19}],"../gather/gatherers/seo/canonical":[function(require,module,exports){
+},{"../../lib/network-request":88,"./gatherer":21}],"../gather/gatherers/seo/canonical":[function(require,module,exports){
 
 
 
@@ -11457,7 +12018,7 @@
 module.exports=Canonical;
 
 
-},{"../gatherer":19}],"../gather/gatherers/seo/crawlable-links":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/seo/crawlable-links":[function(require,module,exports){
 
 
 
@@ -11466,7 +12027,7 @@
 'use strict';
 
 const Gatherer=require('../gatherer');
-const DOMHelpers=require('../../../lib/dom-helpers.js');
+const pageFunctions=require('../../../lib/page-functions.js');
 
 class CrawlableLinks extends Gatherer{
 
@@ -11475,7 +12036,7 @@
 
 afterPass(passContext){
 const expression=`(function() {
-      ${DOMHelpers.getElementsInDocumentFnString}; // define function on page
+      ${pageFunctions.getElementsInDocumentString}; // define function on page
       const selector = 'a[href]:not([rel~="nofollow"])';
       const elements = getElementsInDocument(selector);
       return elements
@@ -11492,7 +12053,7 @@
 module.exports=CrawlableLinks;
 
 
-},{"../../../lib/dom-helpers.js":30,"../gatherer":19}],"../gather/gatherers/seo/embedded-content":[function(require,module,exports){
+},{"../../../lib/page-functions.js":89,"../gatherer":21}],"../gather/gatherers/seo/embedded-content":[function(require,module,exports){
 
 
 
@@ -11501,7 +12062,7 @@
 'use strict';
 
 const Gatherer=require('../gatherer');
-const DOMHelpers=require('../../../lib/dom-helpers.js');
+const pageFunctions=require('../../../lib/page-functions.js');
 
 class EmbeddedContent extends Gatherer{
 
@@ -11510,7 +12071,7 @@
 
 afterPass(passContext){
 const expression=`(function() {
-      ${DOMHelpers.getElementsInDocumentFnString}; // define function on page
+      ${pageFunctions.getElementsInDocumentString}; // define function on page
       const selector = 'object, embed, applet';
       const elements = getElementsInDocument(selector);
       return elements
@@ -11535,7 +12096,7 @@
 
 module.exports=EmbeddedContent;
 
-},{"../../../lib/dom-helpers.js":30,"../gatherer":19}],"../gather/gatherers/seo/font-size":[function(require,module,exports){
+},{"../../../lib/page-functions.js":89,"../gatherer":21}],"../gather/gatherers/seo/font-size":[function(require,module,exports){
 (function(global){
 
 
@@ -11630,7 +12191,7 @@
 const matchingRule=nodeStyles.
 find(style=>
 
-style.allProperties.some(item=>item.name===property&&
+style.allProperties().some(item=>item.name===property&&
 matchedStyles.propertyState(item)!==CSSMatchedStyles.PropertyState.Overloaded));
 
 
@@ -11789,7 +12350,7 @@
 
 
 }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"../../../lib/sentry.js":40,"../../../lib/web-inspector":47,"../../driver.js":17,"../gatherer":19}],"../gather/gatherers/seo/hreflang":[function(require,module,exports){
+},{"../../../lib/sentry.js":90,"../../../lib/web-inspector":96,"../../driver.js":19,"../gatherer":21}],"../gather/gatherers/seo/hreflang":[function(require,module,exports){
 
 
 
@@ -11826,7 +12387,7 @@
 module.exports=Hreflang;
 
 
-},{"../gatherer":19}],"../gather/gatherers/seo/meta-description":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/seo/meta-description":[function(require,module,exports){
 
 
 
@@ -11852,7 +12413,7 @@
 module.exports=MetaDescription;
 
 
-},{"../gatherer":19}],"../gather/gatherers/seo/meta-robots":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/seo/meta-robots":[function(require,module,exports){
 
 
 
@@ -11877,7 +12438,7 @@
 
 module.exports=MetaRobots;
 
-},{"../gatherer":19}],"../gather/gatherers/seo/robots-txt":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/seo/robots-txt":[function(require,module,exports){
 
 
 
@@ -11918,7 +12479,7 @@
 
 module.exports=RobotsTxt;
 
-},{"../gatherer":19}],"../gather/gatherers/service-worker":[function(require,module,exports){
+},{"../gatherer":21}],"../gather/gatherers/service-worker":[function(require,module,exports){
 
 
 
@@ -11943,7 +12504,7 @@
 
 module.exports=ServiceWorker;
 
-},{"./gatherer":19}],"../gather/gatherers/start-url":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/start-url":[function(require,module,exports){
 
 
 
@@ -11970,12 +12531,12 @@
 then(manifest=>{
 const startUrlInfo=this._readManifestStartUrl(manifest);
 if(startUrlInfo.isReadFailure){
-return{statusCode:-1,debugString:startUrlInfo.reason};
+return{statusCode:-1,explanation:startUrlInfo.reason};
 }
 
 return this._attemptManifestFetch(passContext.driver,startUrlInfo.startUrl);
 }).catch(()=>{
-return{statusCode:-1,debugString:'Unable to fetch start URL via service worker'};
+return{statusCode:-1,explanation:'Unable to fetch start URL via service worker'};
 });
 }
 
@@ -11986,7 +12547,7 @@
 
 _readManifestStartUrl(manifest){
 if(!manifest||!manifest.value){
-const detailedMsg=manifest&&manifest.debugString;
+const detailedMsg=manifest&&manifest.warning;
 
 if(detailedMsg){
 return{isReadFailure:true,reason:`Error fetching web app manifest: ${detailedMsg}`};
@@ -11997,8 +12558,8 @@
 
 
 
-if(manifest.value.start_url.debugString){
-return{isReadFailure:true,reason:manifest.value.start_url.debugString};
+if(manifest.value.start_url.warning){
+return{isReadFailure:true,reason:manifest.value.start_url.warning};
 }
 
 
@@ -12016,7 +12577,7 @@
 
 const timeoutPromise=new Promise(resolve=>
 setTimeout(
-()=>resolve({statusCode:-1,debugString:'Timed out waiting for fetched start_url'}),
+()=>resolve({statusCode:-1,explanation:'Timed out waiting for fetched start_url'}),
 3000));
 
 
@@ -12034,7 +12595,7 @@
 if(!response.fromServiceWorker){
 return resolve({
 statusCode:-1,
-debugString:'Unable to fetch start URL via service worker'});
+explanation:'Unable to fetch start URL via service worker'});
 
 }
 
@@ -12050,7 +12611,7 @@
 
 module.exports=StartUrl;
 
-},{"../../lib/manifest-parser":36,"../driver.js":17,"./gatherer":19}],"../gather/gatherers/theme-color":[function(require,module,exports){
+},{"../../lib/manifest-parser":86,"../driver.js":19,"./gatherer":21}],"../gather/gatherers/theme-color":[function(require,module,exports){
 
 
 
@@ -12075,7 +12636,7 @@
 
 module.exports=ThemeColor;
 
-},{"./gatherer":19}],"../gather/gatherers/viewport-dimensions":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/viewport-dimensions":[function(require,module,exports){
 
 
 
@@ -12128,7 +12689,7 @@
 
 module.exports=ViewportDimensions;
 
-},{"./gatherer":19}],"../gather/gatherers/viewport":[function(require,module,exports){
+},{"./gatherer":21}],"../gather/gatherers/viewport":[function(require,module,exports){
 
 
 
@@ -12153,7 +12714,7 @@
 
 module.exports=Viewport;
 
-},{"./gatherer":19}],"./gather/computed/critical-request-chains":[function(require,module,exports){
+},{"./gatherer":21}],"./gather/computed/critical-request-chains":[function(require,module,exports){
 
 
 
@@ -12192,6 +12753,7 @@
 
 
 
+
 const nonCriticalResourceTypes=[
 NetworkRequest.TYPES.Image,
 NetworkRequest.TYPES.XHR,
@@ -12315,7 +12877,7 @@
 
 module.exports=CriticalRequestChains;
 
-},{"../../lib/network-request":38,"./computed-artifact":11,"assert":53}],"./gather/computed/load-simulator":[function(require,module,exports){
+},{"../../lib/network-request":88,"./computed-artifact":11,"assert":102}],"./gather/computed/load-simulator":[function(require,module,exports){
 
 
 
@@ -12341,6 +12903,7 @@
 const{throttlingMethod,throttling}=data.settings;
 const networkAnalysis=await artifacts.requestNetworkAnalysis(data.devtoolsLog);
 
+
 const options={
 additionalRttByOrigin:networkAnalysis.additionalRttByOrigin,
 serverResponseTimeByOrigin:networkAnalysis.serverResponseTimeByOrigin};
@@ -12383,7 +12946,7 @@
 
 module.exports=LoadSimulatorArtifact;
 
-},{"../../config/constants":8,"../../lib/dependency-graph/simulator/simulator":28,"./computed-artifact":11}],"./gather/computed/main-resource":[function(require,module,exports){
+},{"../../config/constants":8,"../../lib/dependency-graph/simulator/simulator":31,"./computed-artifact":11}],"./gather/computed/main-resource":[function(require,module,exports){
 
 
 
@@ -12668,137 +13231,7 @@
 
 module.exports=MainThreadTasks;
 
-},{"../../lib/task-groups":43,"./computed-artifact":11}],"./gather/computed/manifest-values":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const ComputedArtifact=require('./computed-artifact');
-const icons=require('../../lib/icons');
-
-const PWA_DISPLAY_VALUES=['minimal-ui','fullscreen','standalone'];
-
-
-
-const SUGGESTED_SHORTNAME_LENGTH=12;
-
-class ManifestValues extends ComputedArtifact{
-get name(){
-return'ManifestValues';
-}
-
-static get validityIds(){
-return['hasManifest','hasParseableManifest'];
-}
-
-
-
-
-
-
-static get manifestChecks(){
-return[
-{
-id:'hasStartUrl',
-failureText:'Manifest does not contain a `start_url`',
-validate:manifestValue=>!!manifestValue.start_url.value},
-
-{
-id:'hasIconsAtLeast192px',
-failureText:'Manifest does not have icons at least 192px',
-validate:manifestValue=>icons.doExist(manifestValue)&&
-icons.sizeAtLeast(192,manifestValue).length>0},
-
-{
-id:'hasIconsAtLeast512px',
-failureText:'Manifest does not have icons at least 512px',
-validate:manifestValue=>icons.doExist(manifestValue)&&
-icons.sizeAtLeast(512,manifestValue).length>0},
-
-{
-id:'hasPWADisplayValue',
-failureText:'Manifest\'s `display` value is not one of: '+PWA_DISPLAY_VALUES.join(' | '),
-validate:manifestValue=>PWA_DISPLAY_VALUES.includes(manifestValue.display.value)},
-
-{
-id:'hasBackgroundColor',
-failureText:'Manifest does not have `background_color`',
-validate:manifestValue=>!!manifestValue.background_color.value},
-
-{
-id:'hasThemeColor',
-failureText:'Manifest does not have `theme_color`',
-validate:manifestValue=>!!manifestValue.theme_color.value},
-
-{
-id:'hasShortName',
-failureText:'Manifest does not have `short_name`',
-validate:manifestValue=>!!manifestValue.short_name.value},
-
-{
-id:'shortNameLength',
-failureText:`Manifest's \`short_name\` is too long (>${SUGGESTED_SHORTNAME_LENGTH} `+
-`characters) to be displayed on a homescreen without truncation`,
-
-validate:manifestValue=>!!manifestValue.short_name.value&&
-manifestValue.short_name.value.length<=SUGGESTED_SHORTNAME_LENGTH},
-
-{
-id:'hasName',
-failureText:'Manifest does not have `name`',
-validate:manifestValue=>!!manifestValue.name.value}];
-
-
-}
-
-
-
-
-
-
-async compute_(manifest){
-
-let parseFailureReason;
-
-if(manifest===null){
-return{
-isParseFailure:true,
-parseFailureReason:'No manifest was fetched',
-allChecks:[]};
-
-}
-const manifestValue=manifest.value;
-if(manifestValue===undefined){
-return{
-isParseFailure:true,
-parseFailureReason:'Manifest failed to parse as valid JSON',
-allChecks:[]};
-
-}
-
-
-const remainingChecks=ManifestValues.manifestChecks.map(item=>{
-return{
-id:item.id,
-failureText:item.failureText,
-passing:item.validate(manifestValue)};
-
-});
-
-return{
-isParseFailure:false,
-parseFailureReason,
-allChecks:remainingChecks};
-
-}}
-
-
-module.exports=ManifestValues;
-
-},{"../../lib/icons":34,"./computed-artifact":11}],"./gather/computed/metrics/estimated-input-latency":[function(require,module,exports){
+},{"../../lib/task-groups":93,"./computed-artifact":11}],"./gather/computed/metrics/estimated-input-latency":[function(require,module,exports){
 
 
 
@@ -12807,7 +13240,7 @@
 'use strict';
 
 const MetricArtifact=require('./metric');
-const LHError=require('../../../lib/errors');
+const LHError=require('../../../lib/lh-error');
 const TracingProcessor=require('../../../lib/traces/tracing-processor');
 
 const ROLLING_WINDOW_SIZE=5000;
@@ -12867,7 +13300,7 @@
 
 module.exports=EstimatedInputLatency;
 
-},{"../../../lib/errors":33,"../../../lib/traces/tracing-processor":46,"./metric":13}],"./gather/computed/metrics/first-contentful-paint":[function(require,module,exports){
+},{"../../../lib/lh-error":85,"../../../lib/traces/tracing-processor":95,"./metric":14}],"./gather/computed/metrics/first-contentful-paint":[function(require,module,exports){
 
 
 
@@ -12876,7 +13309,6 @@
 'use strict';
 
 const MetricArtifact=require('./metric');
-const LHError=require('../../../lib/errors');
 
 class FirstContentfulPaint extends MetricArtifact{
 get name(){
@@ -12887,22 +13319,19 @@
 
 
 
-computeObservedMetric(data){
+async computeObservedMetric(data){
 const{traceOfTab}=data;
-if(!traceOfTab.timestamps.firstContentfulPaint){
-throw new LHError(LHError.errors.NO_FCP);
-}
 
-return Promise.resolve({
+return{
 timing:traceOfTab.timings.firstContentfulPaint,
-timestamp:traceOfTab.timestamps.firstContentfulPaint});
+timestamp:traceOfTab.timestamps.firstContentfulPaint};
 
 }}
 
 
 module.exports=FirstContentfulPaint;
 
-},{"../../../lib/errors":33,"./metric":13}],"./gather/computed/metrics/first-cpu-idle":[function(require,module,exports){
+},{"./metric":14}],"./gather/computed/metrics/first-cpu-idle":[function(require,module,exports){
 
 
 
@@ -12911,7 +13340,7 @@
 'use strict';
 const MetricArtifact=require('./metric');
 const TracingProcessor=require('../../../lib/traces/tracing-processor');
-const LHError=require('../../../lib/errors');
+const LHError=require('../../../lib/lh-error');
 
 const LONG_TASK_THRESHOLD=50;
 
@@ -13082,14 +13511,14 @@
 const DCL=traceOfTab.timings.domContentLoaded;
 const traceEnd=traceOfTab.timings.traceEnd;
 
-if(traceEnd-FMP<MAX_QUIET_WINDOW_SIZE){
-throw new LHError(LHError.errors.FMP_TOO_LATE_FOR_FCPUI);
-}
-
 if(!FMP||!DCL){
 throw new LHError(FMP?LHError.errors.NO_DCL:LHError.errors.NO_FMP);
 }
 
+if(traceEnd-FMP<MAX_QUIET_WINDOW_SIZE){
+throw new LHError(LHError.errors.FMP_TOO_LATE_FOR_FCPUI);
+}
+
 const longTasksAfterFMP=TracingProcessor.getMainThreadTopLevelEvents(traceOfTab,FMP).
 filter(evt=>evt.duration>=LONG_TASK_THRESHOLD);
 const firstInteractive=FirstCPUIdle.findQuietWindow(FMP,traceEnd,longTasksAfterFMP);
@@ -13110,7 +13539,7 @@
 
 module.exports=FirstCPUIdle;
 
-},{"../../../lib/errors":33,"../../../lib/traces/tracing-processor":46,"./metric":13}],"./gather/computed/metrics/first-meaningful-paint":[function(require,module,exports){
+},{"../../../lib/lh-error":85,"../../../lib/traces/tracing-processor":95,"./metric":14}],"./gather/computed/metrics/first-meaningful-paint":[function(require,module,exports){
 
 
 
@@ -13119,7 +13548,7 @@
 'use strict';
 
 const MetricArtifact=require('./metric');
-const LHError=require('../../../lib/errors');
+const LHError=require('../../../lib/lh-error');
 
 class FirstMeaningfulPaint extends MetricArtifact{
 get name(){
@@ -13130,22 +13559,23 @@
 
 
 
-computeObservedMetric(data){
+async computeObservedMetric(data){
 const{traceOfTab}=data;
 if(!traceOfTab.timestamps.firstMeaningfulPaint){
 throw new LHError(LHError.errors.NO_FMP);
 }
 
-return Promise.resolve({
+return{
+
 timing:traceOfTab.timings.firstMeaningfulPaint,
-timestamp:traceOfTab.timestamps.firstMeaningfulPaint});
+timestamp:traceOfTab.timestamps.firstMeaningfulPaint};
 
 }}
 
 
 module.exports=FirstMeaningfulPaint;
 
-},{"../../../lib/errors":33,"./metric":13}],"./gather/computed/metrics/interactive":[function(require,module,exports){
+},{"../../../lib/lh-error":85,"./metric":14}],"./gather/computed/metrics/interactive":[function(require,module,exports){
 
 
 
@@ -13157,7 +13587,7 @@
 
 const NetworkRecorder=require('../../../lib/network-recorder');
 const TracingProcessor=require('../../../lib/traces/tracing-processor');
-const LHError=require('../../../lib/errors');
+const LHError=require('../../../lib/lh-error');
 
 const REQUIRED_QUIET_WINDOW=5000;
 const ALLOWED_CONCURRENT_REQUESTS=2;
@@ -13296,9 +13726,6 @@
 
 computeObservedMetric(data){
 const{traceOfTab,networkRecords}=data;
-if(!traceOfTab.timestamps.firstContentfulPaint){
-throw new LHError(LHError.errors.NO_FCP);
-}
 
 if(!traceOfTab.timestamps.domContentLoaded){
 throw new LHError(LHError.errors.NO_DCL);
@@ -13332,7 +13759,7 @@
 
 
 
-},{"../../../lib/errors":33,"../../../lib/network-recorder":37,"../../../lib/traces/tracing-processor":46,"./metric":13}],"./gather/computed/metrics/lantern-estimated-input-latency":[function(require,module,exports){
+},{"../../../lib/lh-error":85,"../../../lib/network-recorder":87,"../../../lib/traces/tracing-processor":95,"./metric":14}],"./gather/computed/metrics/lantern-estimated-input-latency":[function(require,module,exports){
 
 
 
@@ -13435,7 +13862,7 @@
 
 module.exports=LanternEstimatedInputLatency;
 
-},{"../../../lib/dependency-graph/base-node":22,"./estimated-input-latency":"./gather/computed/metrics/estimated-input-latency","./lantern-metric":12}],"./gather/computed/metrics/lantern-first-contentful-paint":[function(require,module,exports){
+},{"../../../lib/dependency-graph/base-node":25,"./estimated-input-latency":"./gather/computed/metrics/estimated-input-latency","./lantern-metric":13}],"./gather/computed/metrics/lantern-first-contentful-paint":[function(require,module,exports){
 
 
 
@@ -13515,7 +13942,7 @@
 
 module.exports=FirstContentfulPaint;
 
-},{"../../../lib/dependency-graph/base-node":22,"./lantern-metric":12}],"./gather/computed/metrics/lantern-first-cpu-idle":[function(require,module,exports){
+},{"../../../lib/dependency-graph/base-node":25,"./lantern-metric":13}],"./gather/computed/metrics/lantern-first-cpu-idle":[function(require,module,exports){
 
 
 
@@ -13580,7 +14007,7 @@
 
 module.exports=LanternFirstCPUIdle;
 
-},{"../../../lib/dependency-graph/base-node":22,"./first-cpu-idle":"./gather/computed/metrics/first-cpu-idle","./lantern-interactive":"./gather/computed/metrics/lantern-interactive"}],"./gather/computed/metrics/lantern-first-meaningful-paint":[function(require,module,exports){
+},{"../../../lib/dependency-graph/base-node":25,"./first-cpu-idle":"./gather/computed/metrics/first-cpu-idle","./lantern-interactive":"./gather/computed/metrics/lantern-interactive"}],"./gather/computed/metrics/lantern-first-meaningful-paint":[function(require,module,exports){
 
 
 
@@ -13590,6 +14017,7 @@
 
 const MetricArtifact=require('./lantern-metric');
 const BaseNode=require('../../../lib/dependency-graph/base-node');
+const LHError=require('../../../lib/lh-error');
 
 
 
@@ -13616,6 +14044,10 @@
 
 getOptimisticGraph(dependencyGraph,traceOfTab){
 const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
+if(!fmp){
+throw new LHError(LHError.errors.NO_FMP);
+}
+
 const blockingScriptUrls=MetricArtifact.getScriptUrls(dependencyGraph,node=>{
 return(
 node.endTime<=fmp&&node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
@@ -13641,6 +14073,10 @@
 
 getPessimisticGraph(dependencyGraph,traceOfTab){
 const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
+if(!fmp){
+throw new LHError(LHError.errors.NO_FMP);
+}
+
 const requiredScriptUrls=MetricArtifact.getScriptUrls(dependencyGraph,node=>{
 return node.endTime<=fmp&&node.hasRenderBlockingPriority();
 });
@@ -13673,7 +14109,7 @@
 
 module.exports=FirstMeaningfulPaint;
 
-},{"../../../lib/dependency-graph/base-node":22,"./lantern-metric":12}],"./gather/computed/metrics/lantern-interactive":[function(require,module,exports){
+},{"../../../lib/dependency-graph/base-node":25,"../../../lib/lh-error":85,"./lantern-metric":13}],"./gather/computed/metrics/lantern-interactive":[function(require,module,exports){
 
 
 
@@ -13786,7 +14222,7 @@
 
 module.exports=Interactive;
 
-},{"../../../lib/dependency-graph/base-node":22,"../../../lib/network-request":38,"./lantern-metric":12}],"./gather/computed/metrics/lantern-speed-index":[function(require,module,exports){
+},{"../../../lib/dependency-graph/base-node":25,"../../../lib/network-request":88,"./lantern-metric":13}],"./gather/computed/metrics/lantern-speed-index":[function(require,module,exports){
 
 
 
@@ -13907,7 +14343,7 @@
 
 module.exports=SpeedIndex;
 
-},{"../../../lib/dependency-graph/base-node":22,"./lantern-metric":12}],"./gather/computed/metrics/speed-index":[function(require,module,exports){
+},{"../../../lib/dependency-graph/base-node":25,"./lantern-metric":13}],"./gather/computed/metrics/speed-index":[function(require,module,exports){
 
 
 
@@ -13937,7 +14373,7 @@
 
 module.exports=SpeedIndex;
 
-},{"./metric":13}],"./gather/computed/network-analysis":[function(require,module,exports){
+},{"./metric":14}],"./gather/computed/network-analysis":[function(require,module,exports){
 
 
 
@@ -14004,7 +14440,7 @@
 
 module.exports=NetworkAnalysis;
 
-},{"../../lib/dependency-graph/simulator/network-analyzer":27,"./computed-artifact":11}],"./gather/computed/network-records":[function(require,module,exports){
+},{"../../lib/dependency-graph/simulator/network-analyzer":30,"./computed-artifact":11}],"./gather/computed/network-records":[function(require,module,exports){
 
 
 
@@ -14031,7 +14467,7 @@
 
 module.exports=NetworkRecords;
 
-},{"../../lib/network-recorder":37,"./computed-artifact":11}],"./gather/computed/network-throughput":[function(require,module,exports){
+},{"../../lib/network-recorder":87,"./computed-artifact":11}],"./gather/computed/network-throughput":[function(require,module,exports){
 
 
 
@@ -14193,6 +14629,8 @@
 const nodes=[];
 let i=0;
 
+TracingProcessor.assertHasToplevelEvents(traceOfTab.mainThreadEvents);
+
 const minimumEvtDur=MINIMUM_TASK_DURATION_OF_INTEREST*1000;
 while(i<traceOfTab.mainThreadEvents.length){
 const evt=traceOfTab.mainThreadEvents[i];
@@ -14458,7 +14896,7 @@
 
 
 
-},{"../../lib/dependency-graph/cpu-node":23,"../../lib/dependency-graph/network-node":24,"../../lib/dependency-graph/simulator/network-analyzer":27,"../../lib/network-request":38,"../../lib/traces/tracing-processor":46,"./computed-artifact":11}],"./gather/computed/pushed-requests":[function(require,module,exports){
+},{"../../lib/dependency-graph/cpu-node":26,"../../lib/dependency-graph/network-node":27,"../../lib/dependency-graph/simulator/network-analyzer":30,"../../lib/network-request":88,"../../lib/traces/tracing-processor":95,"./computed-artifact":11}],"./gather/computed/pushed-requests":[function(require,module,exports){
 
 
 
@@ -14516,7 +14954,7 @@
 map(evt=>{
 return{
 timestamp:evt.ts/1000,
-datauri:`data:image/jpg;base64,${evt.args.snapshot}`};
+datauri:`data:image/jpeg;base64,${evt.args.snapshot}`};
 
 });
 }}
@@ -14533,8 +14971,8 @@
 'use strict';
 
 const ComputedArtifact=require('./computed-artifact');
-const speedline=require('speedline');
-const LHError=require('../../lib/errors');
+const speedline=require('speedline-core');
+const LHError=require('../../lib/lh-error');
 
 class Speedline extends ComputedArtifact{
 get name(){
@@ -14583,7 +15021,7 @@
 
 module.exports=Speedline;
 
-},{"../../lib/errors":33,"./computed-artifact":11,"speedline":134}],"./gather/computed/trace-of-tab":[function(require,module,exports){
+},{"../../lib/lh-error":85,"./computed-artifact":11,"speedline-core":186}],"./gather/computed/trace-of-tab":[function(require,module,exports){
 
 
 
@@ -14605,13 +15043,10 @@
 const ComputedArtifact=require('./computed-artifact');
 const log=require('lighthouse-logger');
 const TracingProcessor=require('../../lib/traces/tracing-processor');
-const LHError=require('../../lib/errors');
+const LHError=require('../../lib/lh-error');
 const Sentry=require('../../lib/sentry');
 
-
-
-
-const NetworkRequest=require('../../lib/network-request');
+const ACCEPTABLE_NAVIGATION_URL_REGEX=/^(chrome|https?):/;
 
 class TraceOfTab extends ComputedArtifact{
 get name(){
@@ -14622,6 +15057,17 @@
 
 
 
+
+static isNavigationStartOfInterest(event){
+return event.name==='navigationStart'&&(
+!event.args.data||!event.args.data.documentLoaderURL||
+ACCEPTABLE_NAVIGATION_URL_REGEX.test(event.args.data.documentLoaderURL));
+}
+
+
+
+
+
 static filteredStableSort(traceEvents,filter){
 
 const indices=[];
@@ -14670,7 +15116,7 @@
 const frameEvents=keyEvents.filter(e=>e.args.frame===frameId);
 
 
-const navigationStart=frameEvents.filter(e=>e.name==='navigationStart').pop();
+const navigationStart=frameEvents.filter(TraceOfTab.isNavigationStartOfInterest).pop();
 if(!navigationStart)throw new LHError(LHError.errors.NO_NAVSTART);
 
 
@@ -14680,6 +15126,7 @@
 const firstContentfulPaint=frameEvents.find(
 e=>e.name==='firstContentfulPaint'&&e.ts>navigationStart.ts);
 
+if(!firstContentfulPaint)throw new LHError(LHError.errors.NO_FCP);
 
 
 let firstMeaningfulPaint=frameEvents.find(
@@ -14693,7 +15140,6 @@
 
 if(!firstMeaningfulPaint){
 
-
 Sentry.captureMessage('No firstMeaningfulPaint found, using fallback',{level:'warning'});
 
 const fmpCand='firstMeaningfulPaintCandidate';
@@ -14719,34 +15165,44 @@
 const mainThreadEvents=processEvents.
 filter(e=>e.tid===startedInPageEvt.tid);
 
+
 const traceEnd=trace.traceEvents.reduce((max,evt)=>{
 return max.ts>evt.ts?max:evt;
 });
-
-const metrics={
-navigationStart,
-firstPaint,
-firstContentfulPaint,
-firstMeaningfulPaint,
-traceEnd:{ts:traceEnd.ts+(traceEnd.dur||0)},
-load,
-domContentLoaded};
+const fakeEndOfTraceEvt={ts:traceEnd.ts+(traceEnd.dur||0)};
 
 
-const timings={};
-const timestamps={};
+const getTimestamp=event=>event&&event.ts;
 
-Object.keys(metrics).forEach(metric=>{
-timestamps[metric]=metrics[metric]&&metrics[metric].ts;
-timings[metric]=(timestamps[metric]-navigationStart.ts)/1000;
-});
+const timestamps={
+navigationStart:navigationStart.ts,
+firstPaint:getTimestamp(firstPaint),
+firstContentfulPaint:firstContentfulPaint.ts,
+firstMeaningfulPaint:getTimestamp(firstMeaningfulPaint),
+traceEnd:fakeEndOfTraceEvt.ts,
+load:getTimestamp(load),
+domContentLoaded:getTimestamp(domContentLoaded)};
 
 
 
 
+const getTiming=ts=>(ts-navigationStart.ts)/1000;
+
+const maybeGetTiming=ts=>ts===undefined?undefined:getTiming(ts);
+
+const timings={
+navigationStart:0,
+firstPaint:maybeGetTiming(timestamps.firstPaint),
+firstContentfulPaint:getTiming(timestamps.firstContentfulPaint),
+firstMeaningfulPaint:maybeGetTiming(timestamps.firstMeaningfulPaint),
+traceEnd:getTiming(timestamps.traceEnd),
+load:maybeGetTiming(timestamps.load),
+domContentLoaded:maybeGetTiming(timestamps.domContentLoaded)};
+
+
 return{
-timings:timings,
-timestamps:timestamps,
+timings,
+timestamps,
 processEvents,
 mainThreadEvents,
 startedInPageEvt,
@@ -14763,7 +15219,7 @@
 
 module.exports=TraceOfTab;
 
-},{"../../lib/errors":33,"../../lib/network-request":38,"../../lib/sentry":40,"../../lib/traces/tracing-processor":46,"./computed-artifact":11,"lighthouse-logger":125}],1:[function(require,module,exports){
+},{"../../lib/lh-error":85,"../../lib/sentry":90,"../../lib/traces/tracing-processor":95,"./computed-artifact":11,"lighthouse-logger":147}],1:[function(require,module,exports){
 
 
 
@@ -15056,7 +15512,8 @@
 
 module.exports=Audit;
 
-},{"../lib/statistics":41,"../report/html/renderer/util":48}],3:[function(require,module,exports){
+},{"../lib/statistics":91,"../report/html/renderer/util":97}],3:[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -15067,6 +15524,9 @@
 const Audit=require('../audit');
 const linearInterpolation=require('../../lib/statistics').linearInterpolation;
 const Interactive=require('../../gather/computed/metrics/lantern-interactive');
+const i18n=require('../../lib/i18n/i18n.js');
+
+const str_=i18n.createMessageInstanceIdFn(__filename,{});
 
 
 
@@ -15252,8 +15712,8 @@
 
 
 let displayValue=result.displayValue||'';
-if(typeof result.displayValue==='undefined'&&wastedKb){
-displayValue=['Potential savings of %d\xa0KB',wastedKb];
+if(typeof result.displayValue==='undefined'&&wastedBytes){
+displayValue=str_(i18n.UIStrings.displayValueByteSavings,{wastedBytes});
 }
 
 const details=Audit.makeOpportunityDetails(result.headings,results,wastedMs,wastedBytes);
@@ -15292,7 +15752,8 @@
 
 module.exports=UnusedBytes;
 
-},{"../../gather/computed/metrics/lantern-interactive":"./gather/computed/metrics/lantern-interactive","../../lib/statistics":41,"../audit":2}],4:[function(require,module,exports){
+}).call(this,"/../lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js");
+},{"../../gather/computed/metrics/lantern-interactive":"./gather/computed/metrics/lantern-interactive","../../lib/i18n/i18n.js":36,"../../lib/statistics":91,"../audit":2}],4:[function(require,module,exports){
 
 
 
@@ -15350,8 +15811,10 @@
 
 
 
-static audit(artifacts){
-return Promise.resolve(this.audit_(artifacts)).then(result=>this.createAuditProduct(result));
+
+static async audit(artifacts,context){
+const multiProduct=await this.audit_(artifacts,context);
+return this.createAuditProduct(multiProduct);
 }
 
 
@@ -15399,7 +15862,8 @@
 
 
 
-static audit_(artifacts){
+
+static audit_(artifacts,context){
 throw new Error('audit_ unimplemented');
 }}
 
@@ -15455,7 +15919,8 @@
 const defaultConfigPath='./default-config.js';
 const defaultConfig=require('./default-config.js');
 const fullConfig=require('./full-config.js');
-const constants=require('./constants');
+const constants=require('./constants.js');
+const i18n=require('./../lib/i18n/i18n.js');
 
 const isDeepEqual=require('lodash.isequal');
 const log=require('lighthouse-logger');
@@ -15609,7 +16074,6 @@
 
 
 
-
 function cleanFlagsForSettings(flags={}){
 
 const settings={};
@@ -15617,6 +16081,7 @@
 for(const key of Object.keys(flags)){
 
 if(typeof constants.defaultSettings[key]!=='undefined'){
+
 const safekey=key;
 settings[safekey]=flags[safekey];
 }
@@ -15730,6 +16195,9 @@
 
 
 
+
+
+
 const mergeOptionsOfItems=function(items){
 
 const mergedItems=[];
@@ -15814,6 +16282,45 @@
 
 
 
+getPrintString(){
+const jsonConfig=deepClone(this);
+
+if(jsonConfig.passes){
+for(const pass of jsonConfig.passes){
+for(const gathererDefn of pass.gatherers){
+gathererDefn.implementation=undefined;
+
+gathererDefn.instance=undefined;
+if(Object.keys(gathererDefn.options).length===0){
+
+gathererDefn.options=undefined;
+}
+}
+}
+}
+
+if(jsonConfig.audits){
+for(const auditDefn of jsonConfig.audits){
+
+auditDefn.implementation=undefined;
+if(Object.keys(auditDefn.options).length===0){
+
+auditDefn.options=undefined;
+}
+}
+}
+
+
+i18n.replaceIcuMessageInstanceIds(jsonConfig,jsonConfig.settings.locale);
+
+return JSON.stringify(jsonConfig,null,2);
+}
+
+
+
+
+
+
 static extendConfigJSON(baseJSON,extendJSON){
 if(extendJSON.passes&&baseJSON.passes){
 for(const pass of extendJSON.passes){
@@ -15852,14 +16359,22 @@
 
 
 
-static initSettings(settings={},flags){
+static initSettings(settingsJson={},flags){
+
+
+
+const locale=i18n.lookupLocale(flags&&flags.locale||settingsJson.locale);
+
 
 const{defaultSettings}=constants;
-const settingWithDefaults=merge(deepClone(defaultSettings),settings,true);
+const settingWithDefaults=merge(deepClone(defaultSettings),settingsJson,true);
 
 
 const settingsWithFlags=merge(settingWithDefaults||{},cleanFlagsForSettings(flags),true);
 
+
+settingsWithFlags.locale=locale;
+
 return settingsWithFlags;
 }
 
@@ -16257,7 +16772,7 @@
 module.exports=Config;
 
 }).call(this,"/../lighthouse-core/config");
-},{"../audits/audit.js":2,"../runner.js":50,"./constants":8,"./default-config.js":9,"./full-config.js":10,"lighthouse-logger":125,"lodash.isequal":126,"path":75}],8:[function(require,module,exports){
+},{"../audits/audit.js":2,"../runner.js":99,"./../lib/i18n/i18n.js":36,"./constants.js":8,"./default-config.js":9,"./full-config.js":10,"lighthouse-logger":147,"lodash.isequal":178,"path":124}],8:[function(require,module,exports){
 
 
 
@@ -16296,9 +16811,11 @@
 gatherMode:false,
 disableStorageReset:false,
 disableDeviceEmulation:false,
+emulatedFormFactor:'mobile',
 
 
 
+locale:'en-US',
 blockedUrlPatterns:null,
 additionalTraceCategories:null,
 extraHeaders:null,
@@ -16335,6 +16852,7 @@
 
 
 },{}],9:[function(require,module,exports){
+(function(__filename){
 
 
 
@@ -16342,11 +16860,38 @@
 
 'use strict';
 
+
+
 const constants=require('./constants');
+const i18n=require('../lib/i18n/i18n.js');
+
+const UIStrings={
+
+performanceCategoryTitle:'Performance',
+
+metricGroupTitle:'Metrics',
+
+loadOpportunitiesGroupTitle:'Opportunities',
+
+loadOpportunitiesGroupDescription:'These optimizations can speed up your page load.',
+
+firstPaintImprovementsGroupTitle:'First Paint Improvements',
+
+firstPaintImprovementsGroupDescription:'The most critical aspect of performance is how quickly pixels are rendered onscreen. Key metrics: First Contentful Paint, First Meaningful Paint',
+
+overallImprovementsGroupTitle:'Overall Improvements',
+
+overallImprovementsGroupDescription:'Enhance the overall loading experience, so the page is responsive and ready to use as soon as possible. Key metrics: Time to Interactive, Speed Index',
+
+diagnosticsGroupTitle:'Diagnostics',
+
+diagnosticsGroupDescription:'More information about the performance of your application.'};
 
 
+const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
 
-module.exports={
+
+const defaultConfig={
 settings:constants.defaultSettings,
 passes:[{
 passName:'defaultPass',
@@ -16416,6 +16961,7 @@
 'load-fast-enough-for-pwa',
 'metrics/speed-index',
 'screenshot-thumbnails',
+'final-screenshot',
 'metrics/estimated-input-latency',
 'errors-in-console',
 'time-to-first-byte',
@@ -16481,6 +17027,7 @@
 'accessibility/manual/focus-traps',
 'accessibility/manual/focusable-controls',
 'accessibility/manual/heading-levels',
+'accessibility/manual/interactive-element-affordance',
 'accessibility/manual/logical-tab-order',
 'accessibility/manual/managed-focus',
 'accessibility/manual/offscreen-content-hidden',
@@ -16505,6 +17052,7 @@
 'dobetterweb/geolocation-on-start',
 'dobetterweb/no-document-write',
 'dobetterweb/no-vulnerable-libraries',
+'dobetterweb/js-libraries',
 'dobetterweb/no-websql',
 'dobetterweb/notification-on-start',
 'dobetterweb/password-inputs-can-be-pasted-into',
@@ -16525,15 +17073,15 @@
 
 groups:{
 'metrics':{
-title:'Metrics'},
+title:str_(UIStrings.metricGroupTitle)},
 
 'load-opportunities':{
-title:'Opportunities',
-description:'These are opportunities to speed up your application by optimizing the following resources.'},
+title:str_(UIStrings.loadOpportunitiesGroupTitle),
+description:str_(UIStrings.loadOpportunitiesGroupDescription)},
 
 'diagnostics':{
-title:'Diagnostics',
-description:'More information about the performance of your application.'},
+title:str_(UIStrings.diagnosticsGroupTitle),
+description:str_(UIStrings.diagnosticsGroupDescription)},
 
 'a11y-color-contrast':{
 title:'Color Contrast Is Satisfactory',
@@ -16583,7 +17131,7 @@
 
 categories:{
 'performance':{
-title:'Performance',
+title:str_(UIStrings.performanceCategoryTitle),
 auditRefs:[
 {id:'first-contentful-paint',weight:3,group:'metrics'},
 {id:'first-meaningful-paint',weight:1,group:'metrics'},
@@ -16615,6 +17163,7 @@
 {id:'user-timings',weight:0,group:'diagnostics'},
 {id:'bootup-time',weight:0,group:'diagnostics'},
 {id:'screenshot-thumbnails',weight:0},
+{id:'final-screenshot',weight:0},
 {id:'mainthread-work-breakdown',weight:0,group:'diagnostics'},
 {id:'font-display',weight:0,group:'diagnostics'}]},
 
@@ -16691,6 +17240,7 @@
 
 {id:'logical-tab-order',weight:0},
 {id:'focusable-controls',weight:0},
+{id:'interactive-element-affordance',weight:0},
 {id:'managed-focus',weight:0},
 {id:'focus-traps',weight:0},
 {id:'custom-controls-labels',weight:0},
@@ -16714,6 +17264,7 @@
 {id:'geolocation-on-start',weight:1},
 {id:'doctype',weight:1},
 {id:'no-vulnerable-libraries',weight:1},
+{id:'js-libraries',weight:0},
 {id:'notification-on-start',weight:1},
 {id:'deprecations',weight:1},
 {id:'password-inputs-can-be-pasted-into',weight:1},
@@ -16747,7 +17298,16 @@
 
 
 
-},{"./constants":8}],10:[function(require,module,exports){
+module.exports=defaultConfig;
+
+
+Object.defineProperty(module.exports,'UIStrings',{
+enumerable:false,
+get:()=>UIStrings});
+
+
+}).call(this,"/../lighthouse-core/config/default-config.js");
+},{"../lib/i18n/i18n.js":36,"./constants":8}],10:[function(require,module,exports){
 
 
 
@@ -16755,7 +17315,8 @@
 
 'use strict';
 
-module.exports={
+
+const fullConfig={
 extends:'lighthouse:default',
 settings:{},
 passes:[
@@ -16769,6 +17330,7 @@
 audits:[
 'byte-efficiency/unused-javascript'],
 
+
 categories:{
 'performance':{
 auditRefs:[
@@ -16778,6 +17340,8 @@
 
 
 
+module.exports=fullConfig;
+
 },{}],11:[function(require,module,exports){
 
 
@@ -16852,7 +17416,133 @@
 
 module.exports=ComputedArtifact;
 
-},{"../../lib/arbitrary-equality-map":20}],12:[function(require,module,exports){
+},{"../../lib/arbitrary-equality-map":23}],12:[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+const makeComputedArtifact=require('./new-computed-artifact');
+const icons=require('../../lib/icons');
+
+const PWA_DISPLAY_VALUES=['minimal-ui','fullscreen','standalone'];
+
+
+
+const SUGGESTED_SHORTNAME_LENGTH=12;
+
+class ManifestValues{
+static get validityIds(){
+return['hasManifest','hasParseableManifest'];
+}
+
+
+
+
+
+
+static get manifestChecks(){
+return[
+{
+id:'hasStartUrl',
+failureText:'Manifest does not contain a `start_url`',
+validate:manifestValue=>!!manifestValue.start_url.value},
+
+{
+id:'hasIconsAtLeast192px',
+failureText:'Manifest does not have a PNG icon of at least 192px',
+validate:manifestValue=>icons.doExist(manifestValue)&&
+icons.pngSizedAtLeast(192,manifestValue).length>0},
+
+{
+id:'hasIconsAtLeast512px',
+failureText:'Manifest does not have a PNG icon of at least 512px',
+validate:manifestValue=>icons.doExist(manifestValue)&&
+icons.pngSizedAtLeast(512,manifestValue).length>0},
+
+{
+id:'hasPWADisplayValue',
+failureText:'Manifest\'s `display` value is not one of: '+PWA_DISPLAY_VALUES.join(' | '),
+validate:manifestValue=>PWA_DISPLAY_VALUES.includes(manifestValue.display.value)},
+
+{
+id:'hasBackgroundColor',
+failureText:'Manifest does not have `background_color`',
+validate:manifestValue=>!!manifestValue.background_color.value},
+
+{
+id:'hasThemeColor',
+failureText:'Manifest does not have `theme_color`',
+validate:manifestValue=>!!manifestValue.theme_color.value},
+
+{
+id:'hasShortName',
+failureText:'Manifest does not have `short_name`',
+validate:manifestValue=>!!manifestValue.short_name.value},
+
+{
+id:'shortNameLength',
+failureText:`Manifest's \`short_name\` is too long (>${SUGGESTED_SHORTNAME_LENGTH} `+
+`characters) to be displayed on a homescreen without truncation`,
+
+validate:manifestValue=>!!manifestValue.short_name.value&&
+manifestValue.short_name.value.length<=SUGGESTED_SHORTNAME_LENGTH},
+
+{
+id:'hasName',
+failureText:'Manifest does not have `name`',
+validate:manifestValue=>!!manifestValue.name.value}];
+
+
+}
+
+
+
+
+
+
+static async compute_(manifest){
+
+let parseFailureReason;
+
+if(manifest===null){
+return{
+isParseFailure:true,
+parseFailureReason:'No manifest was fetched',
+allChecks:[]};
+
+}
+const manifestValue=manifest.value;
+if(manifestValue===undefined){
+return{
+isParseFailure:true,
+parseFailureReason:'Manifest failed to parse as valid JSON',
+allChecks:[]};
+
+}
+
+
+const remainingChecks=ManifestValues.manifestChecks.map(item=>{
+return{
+id:item.id,
+failureText:item.failureText,
+passing:item.validate(manifestValue)};
+
+});
+
+return{
+isParseFailure:false,
+parseFailureReason,
+allChecks:remainingChecks};
+
+}}
+
+
+module.exports=makeComputedArtifact(ManifestValues);
+
+},{"../../lib/icons":83,"./new-computed-artifact":15}],13:[function(require,module,exports){
 
 
 
@@ -16940,6 +17630,7 @@
 const optimisticGraph=this.getOptimisticGraph(graph,traceOfTab);
 const pessimisticGraph=this.getPessimisticGraph(graph,traceOfTab);
 
+
 let simulateOptions={label:`optimistic${metricName}`};
 const optimisticSimulation=simulator.simulate(optimisticGraph,simulateOptions);
 
@@ -16989,7 +17680,7 @@
 
 module.exports=LanternMetricArtifact;
 
-},{"../../../lib/dependency-graph/base-node":22,"../../../lib/network-request":38,"../computed-artifact":11}],13:[function(require,module,exports){
+},{"../../../lib/dependency-graph/base-node":25,"../../../lib/network-request":88,"../computed-artifact":11}],14:[function(require,module,exports){
 
 
 
@@ -16998,6 +17689,7 @@
 'use strict';
 
 const ComputedArtifact=require('../computed-artifact');
+const TracingProcessor=require('../../../lib/traces/tracing-processor');
 
 
 
@@ -17050,6 +17742,8 @@
 traceOfTab:await computedArtifacts.requestTraceOfTab(trace)},
 data);
 
+TracingProcessor.assertHasToplevelEvents(augmentedData.traceOfTab.mainThreadEvents);
+
 switch(settings.throttlingMethod){
 case'simulate':
 return this.computeSimulatedMetric(augmentedData,computedArtifacts);
@@ -17064,7 +17758,49 @@
 
 module.exports=ComputedMetric;
 
-},{"../computed-artifact":11}],14:[function(require,module,exports){
+},{"../../../lib/traces/tracing-processor":95,"../computed-artifact":11}],15:[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+const ArbitraryEqualityMap=require('../../lib/arbitrary-equality-map.js');
+
+
+
+
+
+
+
+
+function makeComputedArtifact(computableArtifact){
+
+
+
+
+const request=({computedCache},artifact)=>{
+const cache=computedCache.get(computableArtifact.name)||new ArbitraryEqualityMap();
+computedCache.set(computableArtifact.name,cache);
+
+const computed=cache.get(artifact);
+if(computed){
+return computed;
+}
+
+const artifactPromise=computableArtifact.compute_(artifact);
+cache.set(artifact,artifactPromise);
+
+return artifactPromise;
+};
+
+return Object.assign(computableArtifact,{request});
+}
+
+module.exports=makeComputedArtifact;
+
+},{"../../lib/arbitrary-equality-map.js":23}],16:[function(require,module,exports){
 
 
 
@@ -17074,7 +17810,10 @@
 
 const EventEmitter=require('events').EventEmitter;
 const log=require('lighthouse-logger');
-const LHError=require('../../lib/errors');
+const LHError=require('../../lib/lh-error');
+
+
+
 
 
 
@@ -17088,7 +17827,6 @@
 
 this._callbacks=new Map();
 
-
 this._eventEmitter=new EventEmitter();
 }
 
@@ -17119,6 +17857,43 @@
 
 
 
+
+sendCommand(method,...paramArgs){
+
+const params=paramArgs.length?paramArgs[0]:undefined;
+
+log.formatProtocol('method => browser',{method,params},'verbose');
+const id=++this._lastCommandId;
+const message=JSON.stringify({id,method,params});
+this.sendRawMessage(message);
+
+return new Promise(resolve=>{
+this._callbacks.set(id,{method,resolve});
+});
+}
+
+
+
+
+
+
+on(eventName,cb){
+if(eventName!=='protocolevent'){
+throw new Error('Only supports "protocolevent" events');
+}
+
+if(!this._eventEmitter){
+throw new Error('Attempted to add event listener after connection disposed.');
+}
+this._eventEmitter.on(eventName,cb);
+}
+
+
+
+
+
+
+
 sendRawMessage(message){
 throw new Error('Not implemented');
 }
@@ -17135,11 +17910,9 @@
 
 
 if(!('id'in object)){
-
-const eventMessage=object;
 log.formatProtocol('<= event',
-{method:eventMessage.method,params:eventMessage.params},'verbose');
-this.emitProtocolEvent(eventMessage);
+{method:object.method,params:object.params},'verbose');
+this.emitProtocolEvent(object);
 return;
 }
 
@@ -17147,12 +17920,9 @@
 if(callback){
 this._callbacks.delete(object.id);
 
-
-
 return callback.resolve(Promise.resolve().then(_=>{
 if(object.error){
-const logLevel=callback.options.silent?'verbose':'error';
-log.formatProtocol('method <= browser ERR',{method:callback.method},logLevel);
+log.formatProtocol('method <= browser ERR',{method:callback.method},'error');
 throw LHError.fromProtocolMessage(callback.method,object.error);
 }
 
@@ -17191,49 +17961,9 @@
 }}
 
 
-
-
-
-
-
-Connection.prototype.on=function on(eventName,cb){
-if(eventName!=='protocolevent'){
-throw new Error('Only supports "protocolevent" events');
-}
-
-if(!this._eventEmitter){
-throw new Error('Attempted to add event listener after connection disposed.');
-}
-this._eventEmitter.on(eventName,cb);
-};
-
-
-
-
-
-
-
-function _sendCommand(method,params={},cmdOpts={}){
-
-log.formatProtocol('method => browser',{method,params},'verbose');
-const id=++this._lastCommandId;
-const message=JSON.stringify({id,method,params});
-this.sendRawMessage(message);
-return new Promise(resolve=>{
-this._callbacks.set(id,{resolve,method,options:cmdOpts});
-});
-
-}
-
-
-
-
-
-Connection.prototype.sendCommand=_sendCommand;
-
 module.exports=Connection;
 
-},{"../../lib/errors":33,"events":62,"lighthouse-logger":125}],15:[function(require,module,exports){
+},{"../../lib/lh-error":85,"events":111,"lighthouse-logger":147}],17:[function(require,module,exports){
 
 
 
@@ -17293,7 +18023,7 @@
 
 module.exports=RawConnection;
 
-},{"./connection.js":14}],16:[function(require,module,exports){
+},{"./connection.js":16}],18:[function(require,module,exports){
 
 
 
@@ -17350,7 +18080,7 @@
 
 module.exports=DevtoolsLog;
 
-},{}],17:[function(require,module,exports){
+},{}],19:[function(require,module,exports){
 
 
 
@@ -17361,11 +18091,10 @@
 const NetworkRecorder=require('../lib/network-recorder');
 const emulation=require('../lib/emulation');
 const Element=require('../lib/element');
-const LHError=require('../lib/errors');
+const LHError=require('../lib/lh-error');
 const NetworkRequest=require('../lib/network-request');
 const EventEmitter=require('events').EventEmitter;
 const URL=require('../lib/url-shim');
-const TraceParser=require('../lib/traces/trace-parser');
 const constants=require('../config/constants');
 
 const log=require('lighthouse-logger');
@@ -17397,7 +18126,6 @@
 
 
 
-
 this._eventEmitter=new EventEmitter();
 this._connection=connection;
 
@@ -17427,6 +18155,10 @@
 if(this._networkStatusMonitor){
 this._networkStatusMonitor.dispatch(event);
 }
+
+
+
+
 this._eventEmitter.emit(event.method,event.params);
 });
 }
@@ -17463,6 +18195,14 @@
 
 
 
+
+getBenchmarkIndex(){
+return this.evaluateAsync(`(${pageFunctions.ultradumbBenchmarkString})()`);
+}
+
+
+
+
 connect(){
 return this._connection.connect();
 }
@@ -17489,6 +18229,52 @@
 
 
 
+on(eventName,cb){
+if(this._eventEmitter===null){
+throw new Error('connect() must be called before attempting to listen to events.');
+}
+
+
+log.formatProtocol('listen for event =>',{method:eventName},'verbose');
+this._eventEmitter.on(eventName,cb);
+}
+
+
+
+
+
+
+
+
+once(eventName,cb){
+if(this._eventEmitter===null){
+throw new Error('connect() must be called before attempting to listen to events.');
+}
+
+log.formatProtocol('listen once for event =>',{method:eventName},'verbose');
+this._eventEmitter.once(eventName,cb);
+}
+
+
+
+
+
+
+
+off(eventName,cb){
+if(this._eventEmitter===null){
+throw new Error('connect() must be called before attempting to remove an event listener.');
+}
+
+this._eventEmitter.removeListener(eventName,cb);
+}
+
+
+
+
+
+
+
 
 
 
@@ -17517,6 +18303,25 @@
 
 
 
+
+
+sendCommand(method,...params){
+const domainCommand=/^(\w+)\.(enable|disable)$/.exec(method);
+if(domainCommand){
+const enable=domainCommand[2]==='enable';
+if(!this._shouldToggleDomain(domainCommand[1],enable)){
+return Promise.resolve();
+}
+}
+
+return this._connection.sendCommand(method,...params);
+}
+
+
+
+
+
+
 isDomainEnabled(domain){
 
 return!!this._domainEnabledCounts.get(domain);
@@ -17575,10 +18380,11 @@
 
 expression:`(function wrapInNativePromise() {
           const __nativePromise = window.__nativePromise || Promise;
+          const URL = window.__nativeURL || window.URL;
           return new __nativePromise(function (resolve) {
             return __nativePromise.resolve()
               .then(_ => ${expression})
-              .catch(${pageFunctions.wrapRuntimeEvalErrorInBrowser.toString()})
+              .catch(${pageFunctions.wrapRuntimeEvalErrorInBrowserString})
               .then(resolve);
           });
         }())`,
@@ -17588,15 +18394,23 @@
 contextId};
 
 
-this.sendCommand('Runtime.evaluate',evaluationParams).then(result=>{
+this.sendCommand('Runtime.evaluate',evaluationParams).then(response=>{
 clearTimeout(asyncTimeout);
-const value=result.result.value;
 
-if(result.exceptionDetails){
+if(response.exceptionDetails){
 
-reject(new Error('an unexpected driver error occurred'));
-}if(value&&value.__failedInBrowser){
-reject(Object.assign(new Error(),value));
+return reject(new Error(`Evaluation exception: ${response.exceptionDetails.text}`));
+}
+
+
+if(response.result===undefined){
+return reject(new Error('Runtime.evaluate response did not contain a "result" object'));
+}
+
+const value=response.result.value;
+
+if(value&&value.__failedInBrowser){
+return reject(Object.assign(new Error(),value));
 }else{
 resolve(value);
 }
@@ -17789,7 +18603,7 @@
 let lastTimeout;
 let cancelled=false;
 
-const checkForQuietExpression=`(${pageFunctions.checkTimeSinceLastLongTask.toString()})()`;
+const checkForQuietExpression=`(${pageFunctions.checkTimeSinceLastLongTaskString})()`;
 
 
 
@@ -18207,12 +19021,8 @@
 
 
 return this.sendCommand('Page.enable').
-
-
-then(_=>this.endTraceIfStarted()).
 then(_=>this.sendCommand('Tracing.start',{
 categories:uniqueCategories.join(','),
-transferMode:'ReturnAsStream',
 options:'sampling-frequency=10000'}));
 
 }
@@ -18220,29 +19030,25 @@
 
 
 
-endTraceIfStarted(){
-return new Promise(resolve=>{
-const traceCallback=()=>resolve();
-this.once('Tracing.tracingComplete',traceCallback);
-return this.sendCommand('Tracing.end',undefined,{silent:true}).catch(()=>{
-this.off('Tracing.tracingComplete',traceCallback);
-traceCallback();
-});
-});
-}
-
-
-
-
 endTrace(){
+
+const traceEvents=[];
+
+
+
+
+
+const dataListener=function(data){
+traceEvents.push(...data.value);
+};
+this.on('Tracing.dataCollected',dataListener);
+
 return new Promise((resolve,reject)=>{
-
-this.once('Tracing.tracingComplete',completeEvent=>{
-this._readTraceFromStream(completeEvent).
-then(traceContents=>resolve(traceContents),reject);
+this.once('Tracing.tracingComplete',_=>{
+this.off('Tracing.dataCollected',dataListener);
+resolve({traceEvents});
 });
 
-
 return this.sendCommand('Tracing.end').catch(reject);
 });
 }
@@ -18250,46 +19056,6 @@
 
 
 
-
-_readTraceFromStream(traceCompleteEvent){
-return new Promise((resolve,reject)=>{
-let isEOF=false;
-const parser=new TraceParser();
-
-if(!traceCompleteEvent.stream){
-return reject('No streamHandle returned by traceCompleteEvent');
-}
-
-const readArguments={
-handle:traceCompleteEvent.stream};
-
-
-
-
-
-
-const onChunkRead=response=>{
-if(isEOF){
-return;
-}
-
-parser.parseChunk(response.data);
-
-if(response.eof){
-isEOF=true;
-return resolve(parser.getTrace());
-}
-
-return this.sendCommand('IO.read',readArguments).then(onChunkRead);
-};
-
-this.sendCommand('IO.read',readArguments).then(onChunkRead).catch(reject);
-});
-}
-
-
-
-
 beginDevtoolsLog(){
 this._devtoolsLog.reset();
 this._devtoolsLog.beginRecording();
@@ -18316,8 +19082,13 @@
 
 
 async beginEmulation(settings){
+
 if(!settings.disableDeviceEmulation){
+if(settings.emulatedFormFactor==='mobile'){
 await emulation.enableNexus5X(this);
+}else if(settings.emulatedFormFactor==='desktop'){
+await emulation.enableDesktop(this);
+}
 }
 
 await this.setThrottling(settings,{useThrottling:true});
@@ -18421,7 +19192,8 @@
 
 async cacheNatives(){
 await this.evaluateScriptOnNewDocument(`window.__nativePromise = Promise;
-        window.__nativeError = Error;`);
+        window.__nativeError = Error;
+        window.__nativeURL = URL;`);
 }
 
 
@@ -18429,7 +19201,7 @@
 
 
 async registerPerformanceObserver(){
-const scriptStr=`(${pageFunctions.registerPerformanceObserverInPage.toString()})()`;
+const scriptStr=`(${pageFunctions.registerPerformanceObserverInPageString})()`;
 await this.evaluateScriptOnNewDocument(scriptStr);
 }
 
@@ -18467,82 +19239,9 @@
 }}
 
 
-
-
-
-
-
-Driver.prototype.on=function on(eventName,cb){
-if(this._eventEmitter===null){
-throw new Error('connect() must be called before attempting to listen to events.');
-}
-
-
-log.formatProtocol('listen for event =>',{method:eventName},'verbose');
-this._eventEmitter.on(eventName,cb);
-};
-
-
-
-
-
-
-Driver.prototype.once=function once(eventName,cb){
-if(this._eventEmitter===null){
-throw new Error('connect() must be called before attempting to listen to events.');
-}
-
-log.formatProtocol('listen once for event =>',{method:eventName},'verbose');
-this._eventEmitter.once(eventName,cb);
-};
-
-
-
-
-
-Driver.prototype.off=function off(eventName,cb){
-if(this._eventEmitter===null){
-throw new Error('connect() must be called before attempting to remove an event listener.');
-}
-
-this._eventEmitter.removeListener(eventName,cb);
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-function _sendCommand(method,params={},cmdOpts={}){
-const domainCommand=/^(\w+)\.(enable|disable)$/.exec(method);
-if(domainCommand){
-const enable=domainCommand[2]==='enable';
-
-if(!this._shouldToggleDomain(domainCommand[1],enable)){
-return Promise.resolve();
-}
-}
-
-
-return this._connection.sendCommand(method,params,cmdOpts);
-}
-
-
-
-
-
-Driver.prototype.sendCommand=_sendCommand;
-
 module.exports=Driver;
 
-},{"../config/constants":8,"../lib/element":31,"../lib/emulation":32,"../lib/errors":33,"../lib/network-recorder":37,"../lib/network-request":38,"../lib/page-functions.js":39,"../lib/traces/trace-parser":45,"../lib/url-shim":"url","./connections/connection.js":14,"./devtools-log":16,"events":62,"lighthouse-logger":125}],18:[function(require,module,exports){
+},{"../config/constants":8,"../lib/element":33,"../lib/emulation":34,"../lib/lh-error":85,"../lib/network-recorder":87,"../lib/network-request":88,"../lib/page-functions.js":89,"../lib/url-shim":"url","./connections/connection.js":16,"./devtools-log":18,"events":111,"lighthouse-logger":147}],20:[function(require,module,exports){
 
 
 
@@ -18551,7 +19250,7 @@
 'use strict';
 
 const log=require('lighthouse-logger');
-const LHError=require('../lib/errors');
+const LHError=require('../lib/lh-error');
 const URL=require('../lib/url-shim');
 const NetworkRecorder=require('../lib/network-recorder.js');
 const constants=require('../config/constants');
@@ -18604,6 +19303,7 @@
 
 
 
+
 class GatherRunner{
 
 
@@ -18700,19 +19400,19 @@
 return URL.equalWithExcludedFragments(record.url,url);
 });
 
-let errorCode;
-let errorReason;
+let errorDef;
 if(!mainRecord){
-errorCode=LHError.errors.NO_DOCUMENT_REQUEST;
+errorDef=LHError.errors.NO_DOCUMENT_REQUEST;
 }else if(mainRecord.failed){
-errorCode=LHError.errors.FAILED_DOCUMENT_REQUEST;
-errorReason=mainRecord.localizedFailDescription;
+errorDef={...LHError.errors.FAILED_DOCUMENT_REQUEST};
+errorDef.message+=` ${mainRecord.localizedFailDescription}.`;
+}else if(mainRecord.hasErrorStatusCode()){
+errorDef={...LHError.errors.ERRORED_DOCUMENT_REQUEST};
+errorDef.message+=` Status code: ${mainRecord.statusCode}.`;
 }
 
-if(errorCode){
-const error=new LHError(errorCode,{reason:errorReason});
-log.error('GatherRunner',error.message,url);
-return error;
+if(errorDef){
+return new LHError(errorDef);
 }
 }
 
@@ -18820,9 +19520,8 @@
 if(!driver.online)pageLoadError=undefined;
 
 if(pageLoadError){
-passContext.LighthouseRunWarnings.push('Lighthouse was unable to reliably load the '+
-'page you requested. Make sure you are testing the correct URL and that the server is '+
-'properly responding to all requests.');
+log.error('GatherRunner',pageLoadError.message,passContext.url);
+passContext.LighthouseRunWarnings.push(pageLoadError.friendlyMessage);
 }
 
 
@@ -18874,7 +19573,6 @@
 
 const gathererArtifacts={};
 
-const pageLoadFailures=[];
 const resultsEntries=Object.entries(gathererResults);
 for(const[gathererName,phaseResultsPromises]of resultsEntries){
 if(gathererArtifacts[gathererName]!==undefined)continue;
@@ -18890,18 +19588,11 @@
 
 
 gathererArtifacts[gathererName]=err;
-
-if(LHError.isPageLoadError(err))pageLoadFailures.push(err);
 }
 
 if(gathererArtifacts[gathererName]===undefined){
 throw new Error(`${gathererName} failed to provide an artifact.`);
 }
-
-
-if(pageLoadFailures.length>Object.keys(gathererArtifacts).length*0.5){
-throw pageLoadFailures[0];
-}
 }
 
 
@@ -18919,7 +19610,9 @@
 return{
 fetchTime:new Date().toJSON(),
 LighthouseRunWarnings:[],
-UserAgent:await options.driver.getUserAgent(),
+HostUserAgent:await options.driver.getUserAgent(),
+NetworkUserAgent:'',
+BenchmarkIndex:0,
 traces:{},
 devtoolsLogs:{},
 settings:options.settings,
@@ -18942,6 +19635,7 @@
 await driver.connect();
 const baseArtifacts=await GatherRunner.getBaseArtifacts(options);
 await GatherRunner.loadBlank(driver);
+baseArtifacts.BenchmarkIndex=await options.driver.getBenchmarkIndex();
 await GatherRunner.setupDriver(driver,options);
 
 
@@ -18965,6 +19659,16 @@
 
 baseArtifacts.devtoolsLogs[passConfig.passName]=passData.devtoolsLog;
 
+const userAgentEntry=passData.devtoolsLog.find(entry=>
+entry.method==='Network.requestWillBeSent'&&
+!!entry.params.request.headers['User-Agent']);
+
+
+if(userAgentEntry&&!baseArtifacts.NetworkUserAgent){
+
+baseArtifacts.NetworkUserAgent=userAgentEntry.params.request.headers['User-Agent'];
+}
+
 
 if(passData.trace){
 baseArtifacts.traces[passConfig.passName]=passData.trace;
@@ -18976,6 +19680,8 @@
 firstPass=false;
 }
 }
+const resetStorage=!options.settings.disableStorageReset;
+if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
 await GatherRunner.disposeDriver(driver);
 return GatherRunner.collectArtifacts(gathererResults,baseArtifacts);
 }catch(err){
@@ -18988,7 +19694,7 @@
 
 module.exports=GatherRunner;
 
-},{"../config/constants":8,"../gather/driver.js":17,"../lib/errors":33,"../lib/network-recorder.js":37,"../lib/url-shim":"url","lighthouse-logger":125}],19:[function(require,module,exports){
+},{"../config/constants":8,"../gather/driver.js":19,"../lib/lh-error":85,"../lib/network-recorder.js":87,"../lib/url-shim":"url","lighthouse-logger":147}],21:[function(require,module,exports){
 
 
 
@@ -19050,7 +19756,7 @@
 
 module.exports=Gatherer;
 
-},{}],20:[function(require,module,exports){
+},{}],22:[function(require,module,exports){
 
 
 
@@ -19058,6 +19764,84 @@
 
 'use strict';
 
+const Runner=require('./runner');
+const log=require('lighthouse-logger');
+const ChromeProtocol=require('./gather/connections/cri.js');
+const Config=require('./config/config');
+
+const URL=require('./lib/url-shim.js');
+const LHError=require('./lib/lh-error.js');
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+async function lighthouse(url,flags={},configJSON,connection){
+
+if(url&&(!URL.isValid(url)||!URL.isProtocolAllowed(url))){
+throw new LHError(LHError.errors.INVALID_URL);
+}
+
+
+flags.logLevel=flags.logLevel||'error';
+log.setLevel(flags.logLevel);
+
+const config=generateConfig(configJSON,flags);
+
+connection=connection||new ChromeProtocol(flags.port,flags.hostname);
+
+
+return Runner.run(connection,{url,config});
+}
+
+
+
+
+
+
+
+
+
+function generateConfig(configJson,flags){
+return new Config(configJson,flags);
+}
+
+lighthouse.generateConfig=generateConfig;
+lighthouse.getAuditList=Runner.getAuditList;
+lighthouse.traceCategories=require('./gather/driver').traceCategories;
+lighthouse.Audit=require('./audits/audit');
+lighthouse.Gatherer=require('./gather/gatherers/gatherer');
+
+module.exports=lighthouse;
+
+},{"./audits/audit":2,"./config/config":7,"./gather/connections/cri.js":107,"./gather/driver":19,"./gather/gatherers/gatherer":21,"./lib/lh-error.js":85,"./lib/url-shim.js":"url","./runner":99,"lighthouse-logger":147}],23:[function(require,module,exports){
+
+
+
+
+
+'use strict';
 
 const isEqual=require('lodash.isequal');
 
@@ -19066,7 +19850,7 @@
 
 
 
-module.exports=class ArbitraryEqualityMap{
+class ArbitraryEqualityMap{
 constructor(){
 this._equalsFn=(a,b)=>a===b;
 
@@ -19129,10 +19913,12 @@
 
 static deepEquals(objA,objB){
 return isEqual(objA,objB);
-}};
+}}
 
 
-},{"lodash.isequal":126}],21:[function(require,module,exports){
+module.exports=ArbitraryEqualityMap;
+
+},{"lodash.isequal":178}],24:[function(require,module,exports){
 (function(process){
 
 
@@ -19148,7 +19934,6 @@
 const Simulator=require('./dependency-graph/simulator/simulator');
 const lanternTraceSaver=require('./lantern-trace-saver');
 const Metrics=require('./traces/pwmetrics-events');
-const TraceParser=require('./traces/trace-parser');
 const rimraf=require('rimraf');
 const mkdirp=require('mkdirp');
 
@@ -19170,51 +19955,6 @@
 
 
 
-
-function screenshotDump(screenshots){
-return`
-  <!doctype html>
-  <meta charset="utf-8">
-  <title>screenshots</title>
-  <style>
-html {
-    overflow-x: scroll;
-    overflow-y: hidden;
-    height: 100%;
-    background-image: linear-gradient(to left, #4ca1af , #c4e0e5);
-    background-attachment: fixed;
-    padding: 10px;
-}
-body {
-    white-space: nowrap;
-    background-image: linear-gradient(to left, #4ca1af , #c4e0e5);
-    width: 100%;
-    margin: 0;
-}
-img {
-    margin: 4px;
-}
-</style>
-  <body>
-    <script>
-      var shots = ${JSON.stringify(screenshots)};
-
-  shots.forEach(s => {
-    var i = document.createElement('img');
-    i.src = s.datauri;
-    i.title = s.timestamp;
-    document.body.appendChild(i);
-  });
-  </script>
-  `;
-}
-
-
-
-
-
-
-
 async function loadArtifacts(basePath){
 log.log('Reading artifacts from disk:',basePath);
 
@@ -19230,7 +19970,7 @@
 
 
 artifacts.devtoolsLogs={};
-filenames.filter(f=>f.endsWith(devtoolsLogSuffix)).map(filename=>{
+filenames.filter(f=>f.endsWith(devtoolsLogSuffix)).forEach(filename=>{
 const passName=filename.replace(devtoolsLogSuffix,'');
 const devtoolsLog=JSON.parse(fs.readFileSync(path.join(basePath,filename),'utf8'));
 artifacts.devtoolsLogs[passName]=devtoolsLog;
@@ -19238,22 +19978,12 @@
 
 
 artifacts.traces={};
-const promises=filenames.filter(f=>f.endsWith(traceSuffix)).map(filename=>{
-return new Promise(resolve=>{
+filenames.filter(f=>f.endsWith(traceSuffix)).forEach(filename=>{
+const file=fs.readFileSync(path.join(basePath,filename),{encoding:'utf-8'});
+const trace=JSON.parse(file);
 const passName=filename.replace(traceSuffix,'');
-const readStream=fs.createReadStream(path.join(basePath,filename),{
-encoding:'utf-8',
-highWaterMark:4*1024*1024});
-
-const parser=new TraceParser();
-readStream.on('data',chunk=>parser.parseChunk(chunk));
-readStream.on('end',_=>{
-artifacts.traces[passName]=parser.getTrace();
-resolve();
+artifacts.traces[passName]=Array.isArray(trace)?{traceEvents:trace}:trace;
 });
-});
-});
-await Promise.all(promises);
 
 return artifacts;
 }
@@ -19304,16 +20034,7 @@
 const trace=artifacts.traces[passName];
 const devtoolsLog=artifacts.devtoolsLogs[passName];
 
-
-const Runner=require('../runner.js');
-const computedArtifacts=Runner.instantiateComputedArtifacts();
-
-
-const screenshots=await computedArtifacts.requestScreenshots(trace);
-
 const traceData=Object.assign({},trace);
-const screenshotsHTML=screenshotDump(screenshots);
-
 if(audits){
 const evts=new Metrics(traceData.traceEvents,audits).generateFakeEvents();
 traceData.traceEvents=traceData.traceEvents.concat(evts);
@@ -19322,9 +20043,7 @@
 assets.push({
 passName,
 traceData,
-devtoolsLog,
-screenshotsHTML,
-screenshots});
+devtoolsLog});
 
 }
 
@@ -19435,14 +20154,6 @@
 fs.writeFileSync(devtoolsLogFilename,JSON.stringify(passAssets.devtoolsLog,null,2));
 log.log('saveAssets','devtools log saved to disk: '+devtoolsLogFilename);
 
-const screenshotsHTMLFilename=`${pathWithBasename}-${index}.screenshots.html`;
-fs.writeFileSync(screenshotsHTMLFilename,passAssets.screenshotsHTML);
-log.log('saveAssets','screenshots saved to disk: '+screenshotsHTMLFilename);
-
-const screenshotsJSONFilename=`${pathWithBasename}-${index}.screenshots.json`;
-fs.writeFileSync(screenshotsJSONFilename,JSON.stringify(passAssets.screenshots,null,2));
-log.log('saveAssets','screenshots saved to disk: '+screenshotsJSONFilename);
-
 const streamTraceFilename=`${pathWithBasename}-${index}${traceSuffix}`;
 log.log('saveAssets','streaming trace file to disk: '+streamTraceFilename);
 await saveTrace(passAssets.traceData,streamTraceFilename);
@@ -19462,13 +20173,16 @@
 async function logAssets(artifacts,audits){
 const allAssets=await prepareAssets(artifacts,audits);
 allAssets.map(passAssets=>{
-log.log(`devtoolslog-${passAssets.passName}.json`,JSON.stringify(passAssets.devtoolsLog));
+const dtlogdata=JSON.stringify(passAssets.devtoolsLog);
+
+console.log(`loggedAsset %%% devtoolslog-${passAssets.passName}.json %%% ${dtlogdata}`);
 const traceIter=traceJsonGenerator(passAssets.traceData);
 let traceJson='';
 for(const trace of traceIter){
 traceJson+=trace;
 }
-log.log(`trace-${passAssets.passName}.json`,traceJson);
+
+console.log(`loggedAsset %%% trace-${passAssets.passName}.json %%% ${traceJson}`);
 });
 }
 
@@ -19482,7 +20196,7 @@
 
 
 }).call(this,require('_process'));
-},{"../runner.js":50,"./dependency-graph/simulator/simulator":28,"./lantern-trace-saver":35,"./traces/pwmetrics-events":44,"./traces/trace-parser":45,"_process":77,"lighthouse-logger":125,"mkdirp":58,"path":75,"rimraf":58,"stream":92}],22:[function(require,module,exports){
+},{"./dependency-graph/simulator/simulator":31,"./lantern-trace-saver":84,"./traces/pwmetrics-events":94,"_process":126,"lighthouse-logger":147,"mkdirp":107,"path":124,"rimraf":107,"stream":141}],25:[function(require,module,exports){
 
 
 
@@ -19805,7 +20519,7 @@
 
 module.exports=BaseNode;
 
-},{}],23:[function(require,module,exports){
+},{}],26:[function(require,module,exports){
 
 
 
@@ -19891,7 +20605,7 @@
 
 module.exports=CPUNode;
 
-},{"./base-node":22}],24:[function(require,module,exports){
+},{"./base-node":25}],27:[function(require,module,exports){
 
 
 
@@ -19975,7 +20689,7 @@
 
 module.exports=NetworkNode;
 
-},{"../network-request":38,"./base-node":22}],25:[function(require,module,exports){
+},{"../network-request":88,"./base-node":25}],28:[function(require,module,exports){
 
 
 
@@ -20124,7 +20838,7 @@
 }};
 
 
-},{"./network-analyzer":27,"./tcp-connection":29}],26:[function(require,module,exports){
+},{"./network-analyzer":30,"./tcp-connection":32}],29:[function(require,module,exports){
 
 
 
@@ -20209,7 +20923,7 @@
 
 module.exports=DNSCache;
 
-},{}],27:[function(require,module,exports){
+},{}],30:[function(require,module,exports){
 
 
 
@@ -20220,6 +20934,20 @@
 const INITIAL_CWD=14*1024;
 const NetworkRequest=require('../../network-request');
 
+
+const DEFAULT_SERVER_RESPONSE_PERCENTAGE=0.4;
+
+
+
+
+
+
+const SERVER_RESPONSE_PERCENTAGE_OF_TTFB={
+Document:0.9,
+XHR:0.9,
+Fetch:0.9};
+
+
 class NetworkAnalyzer{
 
 
@@ -20279,6 +21007,8 @@
 
 
 
+
+
 static _estimateValueByOrigin(records,iteratee){
 const connectionWasReused=NetworkAnalyzer.estimateIfConnectionWasReused(records);
 const groupedByOrigin=NetworkAnalyzer.groupByOrigin(records);
@@ -20373,7 +21103,7 @@
 
 
 
-let roundTrips=1;
+let roundTrips=2;
 if(record.parsedURL.scheme==='https')roundTrips+=1;
 return timing.sendStart/roundTrips;
 });
@@ -20386,6 +21116,41 @@
 
 
 
+
+
+static _estimateRTTByOriginViaHeadersEndTiming(records){
+return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
+if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
+if(!record.resourceType)return;
+
+const serverResponseTimePercentage=SERVER_RESPONSE_PERCENTAGE_OF_TTFB[record.resourceType]||
+DEFAULT_SERVER_RESPONSE_PERCENTAGE;
+const estimatedServerResponseTime=timing.receiveHeadersEnd*serverResponseTimePercentage;
+
+
+
+let roundTrips=1;
+
+
+
+if(!connectionReused){
+roundTrips+=1;
+if(record.parsedURL.scheme==='https')roundTrips+=1;
+roundTrips+=1;
+}
+
+
+return Math.max((timing.receiveHeadersEnd-estimatedServerResponseTime)/roundTrips,3);
+});
+}
+
+
+
+
+
+
+
+
 static _estimateResponseTimeByOrigin(records,rttByOrigin){
 return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing})=>{
 if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
@@ -20476,7 +21241,11 @@
 forceCoarseEstimates:false,
 
 
-coarseEstimateMultiplier:0.5},
+coarseEstimateMultiplier:0.3,
+
+useDownloadEstimates:true,
+useSendStartEstimates:true,
+useHeadersEndEstimates:true},
 
 options);
 
@@ -20486,12 +21255,21 @@
 estimatesByOrigin=new Map();
 const estimatesViaDownload=NetworkAnalyzer._estimateRTTByOriginViaDownloadTiming(records);
 const estimatesViaSendStart=NetworkAnalyzer._estimateRTTByOriginViaSendStartTiming(records);
+const estimatesViaTTFB=NetworkAnalyzer._estimateRTTByOriginViaHeadersEndTiming(records);
 
 for(const[origin,estimates]of estimatesViaDownload.entries()){
+if(!options.useDownloadEstimates)continue;
 estimatesByOrigin.set(origin,estimates);
 }
 
 for(const[origin,estimates]of estimatesViaSendStart.entries()){
+if(!options.useSendStartEstimates)continue;
+const existing=estimatesByOrigin.get(origin)||[];
+estimatesByOrigin.set(origin,existing.concat(estimates));
+}
+
+for(const[origin,estimates]of estimatesViaTTFB.entries()){
+if(!options.useHeadersEndEstimates)continue;
 const existing=estimatesByOrigin.get(origin)||[];
 estimatesByOrigin.set(origin,existing.concat(estimates));
 }
@@ -20555,7 +21333,7 @@
 
 
 
-},{"../../network-request":38}],28:[function(require,module,exports){
+},{"../../network-request":88}],31:[function(require,module,exports){
 
 
 
@@ -20624,6 +21402,7 @@
 this._nodeTimings=new Map();
 
 this._numberInProgressByType=new Map();
+
 this._nodes={};
 this._dns=new DNSCache({rtt:this._rtt});
 
@@ -20653,8 +21432,8 @@
 this._numberInProgressByType=new Map();
 
 this._nodes={};
-for(const key of Object.keys(NodeState)){
-this._nodes[NodeState[key]]=new Set();
+for(const state of Object.values(NodeState)){
+this._nodes[state]=new Set();
 }
 }
 
@@ -21035,7 +21814,7 @@
 
 
 
-},{"../../../config/constants":8,"../base-node":22,"./connection-pool":25,"./dns-cache":26,"./tcp-connection":29}],29:[function(require,module,exports){
+},{"../../../config/constants":8,"../base-node":25,"./connection-pool":28,"./dns-cache":29,"./tcp-connection":32}],32:[function(require,module,exports){
 
 
 
@@ -21243,55 +22022,7 @@
 
 
 
-},{}],30:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function getElementsInDocument(selector){
-
-const results=[];
-
-
-const _findAllElements=nodes=>{
-for(let i=0,el;el=nodes[i];++i){
-if(!selector||el.matches(selector)){
-results.push(el);
-}
-
-if(el.shadowRoot){
-_findAllElements(el.shadowRoot.querySelectorAll('*'));
-}
-}
-};
-_findAllElements(document.querySelectorAll('*'));
-
-return results;
-}
-
-module.exports={
-getElementsInDocumentFnString:getElementsInDocument.toString()};
-
-
-},{}],31:[function(require,module,exports){
+},{}],33:[function(require,module,exports){
 
 
 
@@ -21364,7 +22095,7 @@
 
 module.exports=Element;
 
-},{"../gather/driver.js":17}],32:[function(require,module,exports){
+},{"../gather/driver.js":19}],34:[function(require,module,exports){
 
 
 
@@ -21372,8 +22103,7 @@
 
 'use strict';
 
-const Driver=require('../gather/driver');
-const mobile3G=require('../config/constants').throttling.mobile3G;
+
 
 
 
@@ -21395,9 +22125,25 @@
 
 
 
+
+
+
+
+const DESKTOP_EMULATION_METRICS={
+mobile:false,
+width:1366,
+height:768,
+deviceScaleFactor:1};
+
+
 const NEXUS5X_USERAGENT={
 userAgent:'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36'+
-'(KHTML, like Gecko) Chrome/66.0.3359.30 Mobile Safari/537.36'};
+'(KHTML, like Gecko) Chrome/71.0.3559.0 Mobile Safari/537.36'};
+
+
+const DESKTOP_USERAGENT={
+userAgent:'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 '+
+'(KHTML, like Gecko) Chrome/71.0.3559.0 Safari/537.36'};
 
 
 const OFFLINE_METRICS={
@@ -21418,15 +22164,13 @@
 const NO_CPU_THROTTLE_METRICS={
 rate:1};
 
-const CPU_THROTTLE_METRICS={
-rate:4};
 
 
 
 
 
-function enableNexus5X(driver){
-return Promise.all([
+async function enableNexus5X(driver){
+await Promise.all([
 driver.sendCommand('Emulation.setDeviceMetricsOverride',NEXUS5X_EMULATION_METRICS),
 
 driver.sendCommand('Network.enable'),
@@ -21439,8 +22183,22 @@
 
 
 
+async function enableDesktop(driver){
+await Promise.all([
+driver.sendCommand('Emulation.setDeviceMetricsOverride',DESKTOP_EMULATION_METRICS),
 
-function enableNetworkThrottling(driver,throttlingSettings=mobile3G){
+driver.sendCommand('Network.enable'),
+driver.sendCommand('Network.setUserAgentOverride',DESKTOP_USERAGENT),
+driver.sendCommand('Emulation.setTouchEmulationEnabled',{enabled:false})]);
+
+}
+
+
+
+
+
+
+function enableNetworkThrottling(driver,throttlingSettings){
 
 const conditions={
 offline:false,
@@ -21477,10 +22235,7 @@
 
 
 function enableCPUThrottling(driver,throttlingSettings){
-
-const rate=throttlingSettings&&throttlingSettings.cpuSlowdownMultiplier!==undefined?
-throttlingSettings.cpuSlowdownMultiplier:
-CPU_THROTTLE_METRICS.rate;
+const rate=throttlingSettings.cpuSlowdownMultiplier;
 return driver.sendCommand('Emulation.setCPUThrottlingRate',{rate});
 }
 
@@ -21494,6 +22249,7 @@
 
 module.exports={
 enableNexus5X,
+enableDesktop,
 enableNetworkThrottling,
 clearAllNetworkEmulation,
 enableCPUThrottling,
@@ -21501,7 +22257,500 @@
 goOffline};
 
 
-},{"../config/constants":8,"../gather/driver":17}],33:[function(require,module,exports){
+},{}],35:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome extensions negatively affected this page's load performance. Try auditing the page in incognito mode or from a Chrome profile without extensions.",
+"description":"A message displayed in a Lighthouse audit result warning that Chrome extensions on the user's system substantially affected Lighthouse's measurements and instructs the user on how to run again without those extensions."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Script Evaluation",
+"description":"Label for a time column in a data table; entries will be the number of milliseconds spent evaluating script for every script loaded by the page."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Script Parse",
+"description":"Label for a time column in a data table; entries will be the number of milliseconds spent parsing script files for every script loaded by the page."},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total",
+"description":"Label for the total time column in a data table; entries will be the number of milliseconds spent executing per resource loaded by the page."},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Consider reducing the time spent parsing, compiling, and executing JS. You may find delivering smaller JS payloads helps with this. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/bootup).",
+"description":"Description of a Lighthouse audit that tells the user that they should reduce the amount of time spent executing javascript and one method of doing so. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Reduce JavaScript execution time",
+"description":"Title of a diagnostic audit that provides detail on the time spent executing javascript files during the load. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript execution time",
+"description":"Title of a diagnostic audit that provides detail on the time spent executing javascript files during the load. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Large GIFs are inefficient for delivering animated content. Consider using MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save network bytes. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)",
+"description":"Description of a Lighthouse audit that tells the user *why* they should use video instead of GIF format for delivering animated content. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Use video formats for animated content",
+"description":"Imperative title of a Lighthouse audit that tells the user to use video formats rather than animated GIFs, which are wasteful. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should defer loading offscreen images. Offscreen images are images located outside of the visible browser viewport. As they are unseen by the user and slow down page load, they should be loaded later, closer to when the user is going to see them. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Defer offscreen images",
+"description":"Imperative title of a Lighthouse audit that tells the user to defer loading offscreen images. Offscreen images are images located outside of the visible browser viewport. As they are unseen by the user and slow down page load, they should be loaded later, closer to when the user is going to see them. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should reduce or remove network resources that block the initial render of the page. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Eliminate render-blocking resources",
+"description":"Imperative title of a Lighthouse audit that tells the user to reduce or remove network resources that block the initial render of the page. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Large network payloads cost users real money and are highly correlated with long load times. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/network-payloads).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should reduce the size of the network resources required by the page. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Total size was {totalBytes, number, bytes} KB",
+"description":"Used to summarize the total byte size of the page and all its network requests. The `{totalBytes}` placeholder will be replaced with the total byte sizes, shown in kilobytes (e.g. 142 KB)"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Avoid enormous network payloads",
+"description":"Title of a diagnostic audit that provides detail on large network resources required during page load. 'Payloads' is roughly equivalent to 'resources'. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Avoids enormous network payloads",
+"description":"Title of a diagnostic audit that provides detail on large network resources required during page load. 'Payloads' is roughly equivalent to 'resources'. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Minifying CSS files can reduce network payload sizes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/minify-css).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should minify (remove whitespace) the page's CSS code. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minify CSS",
+"description":"Imperative title of a Lighthouse audit that tells the user to minify (remove whitespace) the page's CSS code. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Minifying JavaScript files can reduce payload sizes and script parse time. [Learn more](https://developers.google.com/speed/docs/insights/MinifyResources).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should minify the page’s JS code to reduce file size. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minify JavaScript",
+"description":"Imperative title of a Lighthouse audit that tells the user to minify the page’s JS code to reduce file size. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Remove unused rules from stylesheets to reduce unnecessary bytes consumed by network activity. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/unused-css).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should defer loading any content in CSS that isn’t needed at page load. This is displayed after a user expands the section to see more. No word length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Defer unused CSS",
+"description":"Imperative title of a Lighthouse audit that tells the user to remove content from their CSS that isn’t needed immediately and instead load that content at a later time. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Remove unused JavaScript to reduce bytes consumed by network activity.",
+"description":"Description of a Lighthouse audit that tells the user *why* they should remove JavaScript that is never needed/evaluated by the browser. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Remove unused JavaScript",
+"description":"Imperative title of a Lighthouse audit that tells the user to remove JavaScript that is never evaluated during page load. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"A long cache lifetime can speed up repeat visits to your page. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/cache-policy).",
+"description":"Description of a Lighthouse audit that tells the user *why* they need to adopt a long cache lifetime policy. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount, plural,\n    =1 {1 resource found}\n    other {# resources found}\n    }",
+"description":"[ICU Syntax] Label for the audit identifying network resources with inefficient cache values. Clicking this will expand the audit to show the resources."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Serve static assets with an efficient cache policy",
+"description":"Title of a diagnostic audit that provides details on the any page resources that could have been served with more efficient cache policies. Cache refers to browser disk cache, which keeps old versions of network resources around for future use. This imperative title is shown to users when there is a significant amount of assets served with poor cache policies."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Uses efficient cache policy on static assets",
+"description":"Title of a diagnostic audit that provides detail on the cache policy applies to the page's static assets. Cache refers to browser disk cache, which keeps old versions of network resources around for future use. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimized images load faster and consume less cellular data. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/optimize-images).",
+"description":"Description of a Lighthouse audit that tells the user *why* they need to efficiently encode images. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Efficiently encode images",
+"description":"Imperative title of a Lighthouse audit that tells the user to encode images with optimization (better compression). This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Serve images that are appropriately-sized to save cellular data and improve load time. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/oversized-images).",
+"description":"Description of a Lighthouse audit that tells the user *why* they need to serve appropriately sized images. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Properly size images",
+"description":"Imperative title of a Lighthouse audit that tells the user to resize images to match the display dimensions. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/text-compression).",
+"description":"Description of a Lighthouse audit that tells the user *why* their text-based resources should be served with compression (like gzip). This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Enable text compression",
+"description":"Imperative title of a Lighthouse audit that tells the user to enable text compression (like gzip) in order to enhance the performance of a page. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Image formats like JPEG 2000, JPEG XR, and WebP often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/webp).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should use newer and more efficient image formats. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Serve images in next-gen formats",
+"description":"Imperative title of a Lighthouse audit that tells the user to serve images in newer and more efficient image formats in order to enhance the performance of a page. A non-modern image format was designed 20+ years ago. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"The Critical Request Chains below show you what resources are loaded with a high priority. Consider reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should reduce the depth of critical network requests to enhance initial load of a page . This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount, plural,\n    =1 {1 chain found}\n    other {# chains found}\n    }",
+"description":"[ICU Syntax] Label for an audit identifying the number of sequences of dependent network requests used to load the page."},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimize Critical Requests Depth",
+"description":"Imperative title of a Lighthouse audit that tells the user to reduce the depth of critical network requests to enhance initial load of a page. Critical request chains are series of dependent network requests that are important for page rendering. For example, here's a 4-request-deep chain: The biglogo.jpg image is required, but is requested via the styles.css style code, which is requested by the initialize.js javascript, which is requested by the page's HTML. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element",
+"description":"Table column header for the DOM element. Each DOM element is described with its HTML representation."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic",
+"description":"Table column header for the type of statistic. These statistics describe how big the DOM is (count of DOM nodes, children, depth)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value",
+"description":"Table column header for the observed value of the DOM statistic."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/tools/lighthouse/audits/dom-size).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should reduce the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount, plural,\n    =1 {1 node}\n    other {# nodes}\n    }",
+"description":"[ICU Syntax] Label for an audit identifying the number of DOM nodes found in the page."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Avoid an excessive DOM size",
+"description":"Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximum DOM Depth",
+"description":"Label for the numeric value of the maximum depth in the page's DOM tree."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Total DOM Nodes",
+"description":"Label for the total number of DOM nodes found in the page."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements",
+"description":"Label for the numeric value of the maximum number of children any DOM element in the page has. The element described will have the most children in the page."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Avoids an excessive DOM size",
+"description":"Title of a diagnostic audit that provides detail on the size of the web page's DOM. The size of a DOM is characterized by the total number of DOM nodes and greatest DOM depth. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Leverage the font-display CSS feature to ensure text is user-visible while webfonts are loading. [Learn more](https://developers.google.com/web/updates/2016/02/font-display).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should use the font-display CSS feature. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Ensure text remains visible during webfont load",
+"description":"Title of a diagnostic audit that provides detail on the load of the page's webfonts. Often the text is invisible for seconds before the webfont resource is loaded. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"All text remains visible during webfont loads",
+"description":"Title of a diagnostic audit that provides detail on if all the text on a webpage was visible while the page was loading its webfonts. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Category",
+"description":"Label for the Main Thread Category column in data tables, rows will have a main thread Category and main thread Task Name."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Consider reducing the time spent parsing, compiling and executing JS. You may find delivering smaller JS payloads helps with this.",
+"description":"Description of a Lighthouse audit that tells the user *why* they should reduce JS execution times. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimize main-thread work",
+"description":"Title of a diagnostic audit that provides detail on the main thread work the browser did to load the page. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimizes main-thread work",
+"description":"Title of a diagnostic audit that provides detail on the main thread work the browser did to load the page. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"The score above is an estimate of how long your app takes to respond to user input, in milliseconds, during the busiest 5s window of page load. If your latency is higher than 50 ms, users may perceive your app as laggy. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency).",
+"description":"Description of the Estimated Input Latency metric that estimates the amount of time, in milliseconds, that the app takes to respond to user input. This description is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Estimated Input Latency",
+"description":"The name of the metric that marks the estimated time between the page receiving input (a user clicking, tapping, or typing) and the page responding. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"First Contentful Paint marks the time at which the first text or image is painted. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint).",
+"description":"Description of the First Contentful Paint (FCP) metric, which marks the time at which the first text or image is painted by the browser. This is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"First Contentful Paint",
+"description":"The name of the metric that marks the time at which the first text or image is painted by the browser. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"First CPU Idle marks the first time at which the page's main thread is quiet enough to handle input. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-interactive).",
+"description":"Description of the First CPU Idle metric, which marks the time at which the page has displayed content and the CPU is not busy executing the page's scripts. This is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"First CPU Idle",
+"description":"The name of the metric that marks when the page has displayed content and the CPU is not busy executing the page's scripts. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"First Meaningful Paint measures when the primary content of a page is visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint).",
+"description":"Description of the First Meaningful Paint (FMP) metric, which marks the time at which a majority of the content has been painted by the browser. This is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"First Meaningful Paint",
+"description":"The name of the metric that marks the time at which a majority of the content has been painted by the browser. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interactive marks the time at which the page is fully interactive. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive).",
+"description":"Description of the Time to Interactive (TTI) metric, which evaluates when a page has completed its primary network activity and main thread work. This is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Time to Interactive",
+"description":"The name of the metric that marks the time at which the page is fully loaded and is able to quickly respond to user input (clicks, taps, and keypresses feel responsive). Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index).",
+"description":"Description of the Speed Index metric, which summarizes how quickly the page looked visually complete. This is displayed within a tooltip when the user hovers on the metric name to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Speed Index",
+"description":"The name of the metric that summarizes how quickly the page looked visually complete. The name of this metric is largely abstract and can be loosely translated. Shown to users as the label for the numeric metric value. Ideally fits within a ~40 character limit."},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Redirects introduce additional delays before the page can be loaded. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/redirects).",
+"description":"Description of a Lighthouse audit that tells users why they should reduce the number of server-side redirects on their page. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Avoid multiple page redirects",
+"description":"Imperative title of a Lighthouse audit that tells the user to eliminate the redirects taken through multiple URLs to load the page. This is shown in a list of audits that Lighthouse generates."},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Time To First Byte identifies the time at which your server sends a response. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/ttfb).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should reduce the amount of time it takes their server to start responding to requests. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Root document took {timeInMs, number, milliseconds} ms",
+"description":"Used to summarize the total Time to First Byte duration for the primary HTML response. The `{timeInMs}` placeholder will be replaced with the time duration, shown in milliseconds (e.g. 210 ms)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Reduce server response times (TTFB)",
+"description":"Title of a diagnostic audit that provides detail on how long it took from starting a request to when the server started responding. This imperative title is shown to users when there is a significant amount of execution time that could be reduced."},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Server response times are low (TTFB)",
+"description":"Title of a diagnostic audit that provides detail on how long it took from starting a request to when the server started responding. This descriptive title is shown to users when the amount is acceptable and no user action is required."},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Duration",
+"description":"Label for the Duration column in the User Timing event data table. User Timing API entries are added by the developer of the web page. Durations are only provided for 'Measure' entries. Durations are the number of total number milliseconds from Start Time to their ending point. e.g. '2,020.64 ms'"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Name",
+"description":"Label for the Name column in the User Timing event data table. User Timing API entries are added by the developer of the web page. An example user timing event name: 'pageload_logoimage_done'"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Start Time",
+"description":"Label for the Start Time column in the User Timing event data table. User Timing API entries are added by the developer of the web page. Start Times are the number of milliseconds since the page started loading, e.g. '380.26 ms'"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Type",
+"description":"Label for the Type column in the User Timing event data table. User Timing API entries are added by the developer of the web page. The only possible types are 'Mark' and Measure'."},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Consider instrumenting your app with the User Timing API to measure your app's real-world performance during key user experiences. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing).",
+"description":"Description of a Lighthouse audit that tells the user they may want to use the User Timing API to help measure the performance of aspects of their page load and interaction. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount, plural,\n    =1 {1 user timing}\n    other {# user timings}\n    }",
+"description":"[ICU Syntax] Label for an audit identifying the number of User Timing timestamps present in the page."},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"User Timing marks and measures",
+"description":"Descriptive title of a diagnostic audit that provides details on any timestamps generated by the page. User Timing refers to the 'User Timing API', which enables a website to record specific times as 'marks', or spans of time as 'measures'."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Consider adding preconnect or dns-prefetch resource hints to establish early connections to important third-party origins. [Learn more](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect).",
+"description":"Description of a Lighthouse audit that tells the user how to connect early to third-party domains that will be used to load page resources. This is displayed after a user expands the section to see more. No character length limits. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Preconnect to required origins",
+"description":"Imperative title of a Lighthouse audit that tells the user to connect early to internet domains that will be used to load page resources. Origin is the correct term, however 'domain name' could be used if neccsesary. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Consider using <link rel=preload> to prioritize fetching resources that are currently requested later in page load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/preload).",
+"description":"Description of a Lighthouse audit that tells the user *why* they should preload important network requests. The associated network requests are started halfway through pageload (or later) but should be started at the beginning. This is displayed after a user expands the section to see more. No character length limits. '<link rel=preload>' is the html code the user would include in their page and shouldn't be translated. 'Learn More' becomes link text to additional documentation."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Preload key requests",
+"description":"Imperative title of a Lighthouse audit that tells the user to use <link rel=preload> to initiate important network requests earlier during page load. This is displayed in a list of audit titles that Lighthouse generates."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"More information about the performance of your application.",
+"description":"Description of the diagnostics section of the Performance category. Within this section are audits with non-imperative titles that provide more detail on the page's page load performance characteristics. Whereas the 'Opportunities' suggest an action along with expected time savings, diagnostics do not. Within this section, the user may read the details and deduce additional actions they could take."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostics",
+"description":"Title of the diagnostics section of the Performance category. Within this section are audits with non-imperative titles that provide more detail on the page's page load performance characteristics. Whereas the 'Opportunities' suggest an action along with expected time savings, diagnostics do not. Within this section, the user may read the details and deduce additional actions they could take."},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"The most critical aspect of performance is how quickly pixels are rendered onscreen. Key metrics: First Contentful Paint, First Meaningful Paint",
+"description":"Description of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the time of the first initial render of the webpage."},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"First Paint Improvements",
+"description":"Title of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the time of the first initial render of the webpage."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"These optimizations can speed up your page load.",
+"description":"Description of the opportunity section of the Performance category. 'Optimizations' could also be 'recommendations' or 'suggestions'. Within this section are audits with imperative titles that suggest actions the user can take to improve the loading performance of their web page."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Opportunities",
+"description":"Title of the opportunity section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the loading performance of their web page. 'Suggestion'/'Optimization'/'Recommendation' are reasonable synonyms for 'opportunity' in this case."},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metrics",
+"description":"Title of the speed metrics section of the Performance category. Within this section are various speed metrics which quantify the pageload performance into values presented in seconds and milliseconds."},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Enhance the overall loading experience, so the page is responsive and ready to use as soon as possible. Key metrics: Time to Interactive, Speed Index",
+"description":"Description of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the overall loading performance of their web page."},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Overall Improvements",
+"description":"Title of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the overall loading performance of their web page."},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Performance",
+"description":"Title of the Performance category of audits. Equivalent to 'Web performance', this term is inclusive of all web page speed and loading optimization topics. Also used as a label of a score gauge; try to limit to 20 characters."},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Cache TTL",
+"description":"Label for the TTL column in data tables, entries will be the time to live value of the cache header on a web resource"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Size (KB)",
+"description":"Label for the size column in data tables, entries will be the size of a web resource in kilobytes"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Time Spent",
+"description":"Label for the time spent column in data tables, entries will be the number of milliseconds spent during a particular activity"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL",
+"description":"Label for the URL column in data tables, entries will be the URL of a web resource"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potential Savings (KB)",
+"description":"Label for the wasted bytes column in data tables, entries will be the number of kilobytes the user could reduce their page by if they implemented the suggestions"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potential Savings (ms)",
+"description":"Label for the wasted bytes column in data tables, entries will be the number of milliseconds the user could reduce page load by if they implemented the suggestions"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potential savings of {wastedBytes, number, bytes} KB",
+"description":"Label shown per-audit to show how many bytes smaller the page could be if the user implemented the suggestions. The `{wastedBytes}` placeholder will be replaced with the number of bytes, shown in kilobytes (e.g. 148 KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potential savings of {wastedMs, number, milliseconds} ms",
+"description":"Label shown per-audit to show how many milliseconds faster the page load could be if the user implemented the suggestions. The `{wastedMs}` placeholder will be replaced with the time duration, shown in milliseconds (e.g. 140 ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms",
+"description":"Used to show the duration in milliseconds that something lasted. The `{timeInMs}` placeholder will be replaced with the time duration, shown in milliseconds (e.g. 63 ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s",
+"description":"Used to show the duration in seconds that something lasted. The {timeInMs} placeholder will be replaced with the time duration, shown in seconds (e.g. 5.2 s)"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Show audits",
+"description":"The tooltip text on an expandable chevron icon. Clicking the icon expands a section to reveal a list of audit results that was hidden by default."},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Initial Navigation",
+"description":"String of text shown in a graphical representation of the flow of network requests for the web page. This label represents the initial network request that fetches an HTML page. This navigation may be redirected (eg. Initial navigation to http://example.com redirects to https://www.example.com)."},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maximum critical path latency:",
+"description":"Label of value shown in the summary of critical request chains. Refers to the total amount of time (milliseconds) of the longest critical path chain/sequence of network requests. Example value: 2310 ms"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Error!",
+"description":"A label, shown next to an audit title or metric title, indicating that there was an error computing it. The user can hover on the label to reveal a tooltip with the extended error message. Translation should be short (< 20 characters)."},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Report error: no audit information",
+"description":"An error string displayed next to a particular audit when it has errored, but not provided any specific error message."},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Lab Data",
+"description":"Title of the lab data section of the Performance category. Within this section are various speed metrics which quantify the pageload performance into values presented in seconds and milliseconds. \"Lab\" is an abbreviated form of \"laboratory\", and refers to the fact that the data is from a controlled test of a website, not measurements from real users visiting that site."},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on emulated 3G. Values are estimated and may vary.",
+"description":"Explanation shown to users below performance results to inform them that the test was done with a 3G network connection and to warn them that the numbers they see will likely change slightly the next time they run Lighthouse. 'Lighthouse' becomes link text to additional documentation."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Additional items to manually check",
+"description":"Section heading shown above a list of audits that were not computed by Lighthouse. They serve as a list of suggestions for the user to go and manually check. For example, Lighthouse can't automate testing cross-browser compatibility, so that is listed within this section, so the user is reminded to test it themselves. This section is collapsed by default, as the user should be focusing on the failed audits instead. Users can click this heading to reveal the list."},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Not applicable",
+"description":"Section heading shown above a list of audits that do not apply to the page. For example, if an audit is 'Are images optimized?', but the page has no images on it, the audit will be marked as not applicable. This is neither passing or failing. This section is collapsed by default, as the user should be focusing on the failed audits instead. Users can click this heading to reveal the list."},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Opportunity",
+"description":"Column heading label for the listing of opportunity audits. Each audit title represents an opportunity. There are only 2 columns, so no strict character limit."},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Estimated Savings",
+"description":"Column heading label for the estimated page load savings of opportunity audits. Estimated Savings is the total amount of time (in seconds) that Lighthouse computed could be reduced from the total page load time, if the suggested action is taken. There are only 2 columns, so no strict character limit."},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Passed audits",
+"description":"Section heading shown above a list of audits that are passing. 'Passed' here refers to a passing grade. This section is collapsed by default, as the user should be focusing on the failed audits instead. Users can click this heading to reveal the list."},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Score scale:",
+"description":"Label preceding a pictorial explanation of the scoring scale: 0-50 is red (bad), 50-90 is orange (ok), 90-100 is green (good). These colors are used throughout the report to provide context for how good/bad a particular result is."},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"There were issues affecting this run of Lighthouse:",
+"description":"Label shown preceding any important warnings that may have invalidated the entire report. For example, if the user has Chrome extensions installed, they may add enough performance overhead that Lighthouse's performance metrics are unreliable. If shown, this will be displayed at the top of the report UI."},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Values are estimated and may vary.",
+"description":"Disclaimer shown to users below the metric values (First Contentful Paint, Time to Interactive, etc) to warn them that the numbers they see will likely change slightly the next time they run Lighthouse."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Warnings: ",
+"description":"This label is shown above a bulleted list of warnings. It is shown directly below an audit that produced warnings. Warnings describe situations the user should be aware of, as Lighthouse was unable to complete all the work required on this audit. For example, The 'Unable to decode image (biglogo.jpg)' warning may show up below an image encoding audit."}};
+
+
+
+},{}],36:[function(require,module,exports){
+(function(__filename,__dirname){
 
 
 
@@ -21509,7 +22758,71 @@
 
 'use strict';
 
-const strings=require('./strings');
+const path=require('path');
+const isDeepEqual=require('lodash.isequal');
+const log=require('lighthouse-logger');
+const MessageFormat=require('intl-messageformat').default;
+const MessageParser=require('intl-messageformat-parser');
+const lookupClosestLocale=require('lookup-closest-locale');
+const LOCALES=require('./locales.js');
+
+const LH_ROOT=path.join(__dirname,'../../../');
+const MESSAGE_INSTANCE_ID_REGEX=/(.* \| .*) # (\d+)$/;
+
+const MESSAGE_INSTANCE_ID_QUICK_REGEX=/ # \d+$/;
+
+(()=>{
+
+
+try{
+
+const IntlPolyfill=require('intl');
+
+if(!IntlPolyfill.NumberFormat)return;
+
+Intl.NumberFormat=IntlPolyfill.NumberFormat;
+Intl.DateTimeFormat=IntlPolyfill.DateTimeFormat;
+}catch(_){
+log.warn('i18n','Failed to install `intl` polyfill');
+}
+})();
+
+
+const UIStrings={
+
+ms:'{timeInMs, number, milliseconds}\xa0ms',
+
+seconds:'{timeInMs, number, seconds}\xa0s',
+
+displayValueByteSavings:'Potential savings of {wastedBytes, number, bytes}\xa0KB',
+
+displayValueMsSavings:'Potential savings of {wastedMs, number, milliseconds}\xa0ms',
+
+columnURL:'URL',
+
+columnSize:'Size (KB)',
+
+columnCacheTTL:'Cache TTL',
+
+columnWastedBytes:'Potential Savings (KB)',
+
+columnWastedMs:'Potential Savings (ms)',
+
+columnTimeSpent:'Time Spent'};
+
+
+const formats={
+number:{
+bytes:{
+maximumFractionDigits:0},
+
+milliseconds:{
+maximumFractionDigits:0},
+
+seconds:{
+
+minimumFractionDigits:1,
+maximumFractionDigits:1}}};
 
 
 
@@ -21518,27 +22831,57 @@
 
 
 
-class LighthouseError extends Error{
 
 
 
 
-constructor(errorDefinition,properties){
-super(errorDefinition.code);
-this.name='LHError';
-this.code=errorDefinition.code;
-this.friendlyMessage=errorDefinition.message;
-if(properties)Object.assign(this,properties);
 
-Error.captureStackTrace(this,LighthouseError);
+
+function lookupLocale(locale){
+
+const canonicalLocale=Intl.getCanonicalLocales(locale)[0];
+
+const closestLocale=lookupClosestLocale(canonicalLocale,LOCALES);
+return closestLocale||'en';
 }
 
 
 
 
-static isPageLoadError(err){
-return err.code===ERRORS.NO_DOCUMENT_REQUEST.code||
-err.code===ERRORS.FAILED_DOCUMENT_REQUEST.code;
+
+function _preprocessMessageValues(icuMessage,values){
+if(!values)return;
+
+const clonedValues=JSON.parse(JSON.stringify(values));
+const parsed=MessageParser.parse(icuMessage);
+
+parsed.elements.
+filter(el=>el.type==='argumentElement').
+forEach(el=>{
+if(el.id&&el.id in values===false){
+throw new Error('ICU Message contains a value reference that wasn\'t provided');
+}
+});
+
+
+parsed.elements.
+filter(el=>el.format&&el.format.style==='milliseconds').
+
+forEach(el=>clonedValues[el.id]=Math.round(clonedValues[el.id]/10)*10);
+
+
+parsed.elements.
+filter(el=>el.format&&el.format.style==='seconds'&&el.id==='timeInMs').
+
+forEach(el=>clonedValues[el.id]=Math.round(clonedValues[el.id]/100)/10);
+
+
+parsed.elements.
+filter(el=>el.format&&el.format.style==='bytes').
+
+forEach(el=>clonedValues[el.id]=clonedValues[el.id]/1024);
+
+return clonedValues;
 }
 
 
@@ -21546,67 +22889,202 @@
 
 
 
-static fromProtocolMessage(method,protocolError){
 
-const protocolErrors=Object.keys(ERRORS).filter(k=>ERRORS[k].pattern).map(k=>ERRORS[k]);
 
-const matchedErrorDefinition=protocolErrors.find(e=>e.pattern.test(protocolError.message));
-if(matchedErrorDefinition){
-return new LighthouseError(matchedErrorDefinition,{
-protocolMethod:method,
-protocolError:protocolError.message});
 
+const _icuMessageInstanceMap=new Map();
+
+
+
+
+
+
+
+
+
+function _formatIcuMessage(locale,icuMessageId,icuMessage,values){
+const localeMessages=LOCALES[locale];
+const localeMessage=localeMessages[icuMessageId]&&localeMessages[icuMessageId].message;
+
+
+const messageForMessageFormat=localeMessage||icuMessage;
+
+const localeForMessageFormat=locale==='en-XA'?'de-DE':locale;
+
+const valuesForMessageFormat=_preprocessMessageValues(icuMessage,values);
+
+const formatter=new MessageFormat(messageForMessageFormat,localeForMessageFormat,formats);
+const formattedString=formatter.format(valuesForMessageFormat);
+
+return{formattedString,icuMessage:messageForMessageFormat};
 }
 
 
-let errMsg=`(${method}): ${protocolError.message}`;
-if(protocolError.data)errMsg+=` (${protocolError.data})`;
-const error=new Error(`Protocol error ${errMsg}`);
-return Object.assign(error,{protocolMethod:method,protocolError:protocolError.message});
-}}
+function _formatPathAsString(pathInLHR){
+let pathAsString='';
+for(const property of pathInLHR){
+if(/^[a-z]+$/i.test(property)){
+if(pathAsString.length)pathAsString+='.';
+pathAsString+=property;
+}else{
+if(/]|"|'|\s/.test(property))throw new Error(`Cannot handle "${property}" in i18n`);
+pathAsString+=`[${property}]`;
+}
+}
+
+return pathAsString;
+}
 
 
-const ERRORS={
-
-NO_SPEEDLINE_FRAMES:{message:strings.didntCollectScreenshots},
-SPEEDINDEX_OF_ZERO:{message:strings.didntCollectScreenshots},
-NO_SCREENSHOTS:{message:strings.didntCollectScreenshots},
-INVALID_SPEEDLINE:{message:strings.didntCollectScreenshots},
 
 
-NO_TRACING_STARTED:{message:strings.badTraceRecording},
-NO_NAVSTART:{message:strings.badTraceRecording},
-NO_FCP:{message:strings.badTraceRecording},
-NO_FMP:{message:strings.badTraceRecording},
-NO_DCL:{message:strings.badTraceRecording},
+
+function getRendererFormattedStrings(locale){
+const icuMessageIds=Object.keys(LOCALES[locale]).filter(f=>f.includes('core/report/html/'));
+
+const strings={};
+for(const icuMessageId of icuMessageIds){
+const[filename,varName]=icuMessageId.split(' | ');
+if(!filename.endsWith('util.js'))throw new Error(`Unexpected message: ${icuMessageId}`);
+strings[varName]=LOCALES[locale][icuMessageId].message;
+}
+
+return strings;
+}
 
 
-FMP_TOO_LATE_FOR_FCPUI:{message:strings.pageLoadTookTooLong},
-NO_FCPUI_IDLE_PERIOD:{message:strings.pageLoadTookTooLong},
-NO_TTI_CPU_IDLE_PERIOD:{message:strings.pageLoadTookTooLong},
-NO_TTI_NETWORK_IDLE_PERIOD:{message:strings.pageLoadTookTooLong},
 
 
-NO_DOCUMENT_REQUEST:{message:strings.pageLoadFailed},
-FAILED_DOCUMENT_REQUEST:{message:strings.pageLoadFailed},
+
+function createMessageInstanceIdFn(filename,fileStrings){
+
+const mergedStrings={...UIStrings,...fileStrings};
 
 
-TRACING_ALREADY_STARTED:{message:strings.internalChromeError,pattern:/Tracing.*started/},
-PARSING_PROBLEM:{message:strings.internalChromeError,pattern:/Parsing problem/},
-READ_FAILED:{message:strings.internalChromeError,pattern:/Read failed/},
+const getMessageInstanceIdFn=(icuMessage,values)=>{
+const keyname=Object.keys(mergedStrings).find(key=>mergedStrings[key]===icuMessage);
+if(!keyname)throw new Error(`Could not locate: ${icuMessage}`);
+
+const filenameToLookup=keyname in fileStrings?filename:__filename;
+const unixStyleFilename=path.relative(LH_ROOT,filenameToLookup).replace(/\\/g,'/');
+const icuMessageId=`${unixStyleFilename} | ${keyname}`;
+const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];
+
+let indexOfInstance=icuMessageInstances.findIndex(inst=>isDeepEqual(inst.values,values));
+if(indexOfInstance===-1){
+icuMessageInstances.push({icuMessageId,icuMessage,values});
+indexOfInstance=icuMessageInstances.length-1;
+}
+
+_icuMessageInstanceMap.set(icuMessageId,icuMessageInstances);
+
+return`${icuMessageId} # ${indexOfInstance}`;
+};
+
+return getMessageInstanceIdFn;
+}
 
 
-REQUEST_CONTENT_TIMEOUT:{message:strings.requestContentTimeout}};
 
 
-Object.keys(ERRORS).forEach(code=>ERRORS[code].code=code);
 
 
-LighthouseError.errors=ERRORS;
-module.exports=LighthouseError;
+function isIcuMessage(icuMessageIdOrRawString){
+return MESSAGE_INSTANCE_ID_QUICK_REGEX.test(icuMessageIdOrRawString)&&
+MESSAGE_INSTANCE_ID_REGEX.test(icuMessageIdOrRawString);
+}
 
 
-},{"./strings":42}],34:[function(require,module,exports){
+
+
+
+
+function getFormatted(icuMessageIdOrRawString,locale){
+if(isIcuMessage(icuMessageIdOrRawString)){
+return _resolveIcuMessageInstanceId(icuMessageIdOrRawString,locale).formattedString;
+}
+
+return icuMessageIdOrRawString;
+}
+
+
+
+
+
+
+function _resolveIcuMessageInstanceId(icuMessageInstanceId,locale){
+const matches=icuMessageInstanceId.match(MESSAGE_INSTANCE_ID_REGEX);
+if(!matches)throw new Error(`${icuMessageInstanceId} is not a valid message instance ID`);
+
+const[_,icuMessageId,icuMessageInstanceIndex]=matches;
+const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];
+const icuMessageInstance=icuMessageInstances[Number(icuMessageInstanceIndex)];
+
+const{formattedString}=_formatIcuMessage(locale,icuMessageId,
+icuMessageInstance.icuMessage,icuMessageInstance.values);
+
+return{icuMessageInstance,formattedString};
+}
+
+
+
+
+
+
+
+
+
+function replaceIcuMessageInstanceIds(inputObject,locale){
+
+
+
+
+
+function replaceInObject(subObject,icuMessagePaths,pathInLHR=[]){
+if(typeof subObject!=='object'||!subObject)return;
+
+for(const[property,value]of Object.entries(subObject)){
+const currentPathInLHR=pathInLHR.concat([property]);
+
+
+if(typeof value==='string'&&isIcuMessage(value)){
+const{icuMessageInstance,formattedString}=_resolveIcuMessageInstanceId(value,locale);
+const messageInstancesInLHR=icuMessagePaths[icuMessageInstance.icuMessageId]||[];
+const currentPathAsString=_formatPathAsString(currentPathInLHR);
+
+messageInstancesInLHR.push(
+icuMessageInstance.values?
+{values:icuMessageInstance.values,path:currentPathAsString}:
+currentPathAsString);
+
+
+subObject[property]=formattedString;
+icuMessagePaths[icuMessageInstance.icuMessageId]=messageInstancesInLHR;
+}else{
+replaceInObject(value,icuMessagePaths,currentPathInLHR);
+}
+}
+}
+
+
+const icuMessagePaths={};
+replaceInObject(inputObject,icuMessagePaths);
+return icuMessagePaths;
+}
+
+module.exports={
+_formatPathAsString,
+UIStrings,
+lookupLocale,
+getRendererFormattedStrings,
+createMessageInstanceIdFn,
+getFormatted,
+replaceIcuMessageInstanceIds,
+isIcuMessage};
+
+
+}).call(this,"/../lighthouse-core/lib/i18n/i18n.js","/../lighthouse-core/lib/i18n");
+},{"./locales.js":37,"intl":107,"intl-messageformat":168,"intl-messageformat-parser":166,"lighthouse-logger":147,"lodash.isequal":178,"lookup-closest-locale":179,"path":124}],37:[function(require,module,exports){
 
 
 
@@ -21618,6 +23096,16702 @@
 
 
 
+
+
+
+
+
+
+
+const locales={
+'en-US':require('./en-US.json'),
+
+'en':require('./en-US.json'),
+
+
+'en-AU':require('./locales/en-GB.json'),
+'en-GB':require('./locales/en-GB.json'),
+'en-IE':require('./locales/en-GB.json'),
+'en-SG':require('./locales/en-GB.json'),
+'en-ZA':require('./locales/en-GB.json'),
+'en-IN':require('./locales/en-GB.json'),
+
+
+'ar-XB':require('./locales/ar-XB.json'),
+'ar':require('./locales/ar.json'),
+'bg':require('./locales/bg.json'),
+'bs':require('./locales/hr.json'),
+'ca':require('./locales/ca.json'),
+'cs':require('./locales/cs.json'),
+'da':require('./locales/da.json'),
+'de':require('./locales/de.json'),
+'el':require('./locales/el.json'),
+'en-XA':require('./locales/en-XA.json'),
+'es':require('./locales/es.json'),
+'fi':require('./locales/fi.json'),
+'fil':require('./locales/fil.json'),
+'fr':require('./locales/fr.json'),
+'he':require('./locales/he.json'),
+'hi':require('./locales/hi.json'),
+'hr':require('./locales/hr.json'),
+'hu':require('./locales/hu.json'),
+'gsw':require('./locales/de.json'),
+'id':require('./locales/id.json'),
+'in':require('./locales/id.json'),
+'it':require('./locales/it.json'),
+'iw':require('./locales/he.json'),
+'ja':require('./locales/ja.json'),
+'ko':require('./locales/ko.json'),
+'ln':require('./locales/fr.json'),
+'lt':require('./locales/lt.json'),
+'lv':require('./locales/lv.json'),
+'mo':require('./locales/ro.json'),
+'nl':require('./locales/nl.json'),
+'nb':require('./locales/no.json'),
+'no':require('./locales/no.json'),
+'pl':require('./locales/pl.json'),
+'pt':require('./locales/pt.json'),
+'pt-PT':require('./locales/pt-PT.json'),
+'ro':require('./locales/ro.json'),
+'ru':require('./locales/ru.json'),
+'sk':require('./locales/sk.json'),
+'sl':require('./locales/sl.json'),
+'sr':require('./locales/sr.json'),
+'sr-Latn':require('./locales/sr-Latn.json'),
+'sv':require('./locales/sv.json'),
+'ta':require('./locales/ta.json'),
+'te':require('./locales/te.json'),
+'th':require('./locales/th.json'),
+'tl':require('./locales/fil.json'),
+'tr':require('./locales/tr.json'),
+'uk':require('./locales/uk.json'),
+'vi':require('./locales/vi.json'),
+'zh':require('./locales/zh.json'),
+'zh-HK':require('./locales/zh-HK.json'),
+'zh-TW':require('./locales/zh-TW.json')};
+
+
+module.exports=locales;
+
+},{"./en-US.json":35,"./locales/ar-XB.json":38,"./locales/ar.json":39,"./locales/bg.json":40,"./locales/ca.json":41,"./locales/cs.json":42,"./locales/da.json":43,"./locales/de.json":44,"./locales/el.json":45,"./locales/en-GB.json":46,"./locales/en-XA.json":47,"./locales/es.json":48,"./locales/fi.json":49,"./locales/fil.json":50,"./locales/fr.json":51,"./locales/he.json":52,"./locales/hi.json":53,"./locales/hr.json":54,"./locales/hu.json":55,"./locales/id.json":56,"./locales/it.json":57,"./locales/ja.json":58,"./locales/ko.json":59,"./locales/lt.json":60,"./locales/lv.json":61,"./locales/nl.json":62,"./locales/no.json":63,"./locales/pl.json":64,"./locales/pt-PT.json":65,"./locales/pt.json":66,"./locales/ro.json":67,"./locales/ru.json":68,"./locales/sk.json":69,"./locales/sl.json":70,"./locales/sr-Latn.json":71,"./locales/sr.json":72,"./locales/sv.json":73,"./locales/ta.json":74,"./locales/te.json":75,"./locales/th.json":76,"./locales/tr.json":77,"./locales/uk.json":78,"./locales/vi.json":79,"./locales/zh-HK.json":80,"./locales/zh-TW.json":81,"./locales/zh.json":82}],38:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"‏‮Chrome‬‏ ‏‮extensions‬‏ ‏‮negatively‬‏ ‏‮affected‬‏ ‏‮this‬‏ ‏‮page‬‏'‏‮s‬‏ ‏‮load‬‏ ‏‮performance‬‏. ‏‮Try‬‏ ‏‮auditing‬‏ ‏‮the‬‏ ‏‮page‬‏ ‏‮in‬‏ ‏‮incognito‬‏ ‏‮mode‬‏ ‏‮or‬‏ ‏‮from‬‏ ‏‮a‬‏ ‏‮Chrome‬‏ ‏‮profile‬‏ ‏‮without‬‏ ‏‮extensions‬‏."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"‏‮Script‬‏ ‏‮Evaluation‬‏"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"‏‮Script‬‏ ‏‮Parse‬‏"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"‏‮Total‬‏"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"‏‮Consider‬‏ ‏‮reducing‬‏ ‏‮the‬‏ ‏‮time‬‏ ‏‮spent‬‏ ‏‮parsing‬‏, ‏‮compiling‬‏, ‏‮and‬‏ ‏‮executing‬‏ ‏‮JS‬‏. ‏‮You‬‏ ‏‮may‬‏ ‏‮find‬‏ ‏‮delivering‬‏ ‏‮smaller‬‏ ‏‮JS‬‏ ‏‮payloads‬‏ ‏‮helps‬‏ ‏‮with‬‏ ‏‮this‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮bootup‬‏)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"‏‮Reduce‬‏ ‏‮JavaScript‬‏ ‏‮execution‬‏ ‏‮time‬‏"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"‏‮JavaScript‬‏ ‏‮execution‬‏ ‏‮time‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"‏‮Large‬‏ ‏‮GIFs‬‏ ‏‮are‬‏ ‏‮inefficient‬‏ ‏‮for‬‏ ‏‮delivering‬‏ ‏‮animated‬‏ ‏‮content‬‏. ‏‮Consider‬‏ ‏‮using‬‏ ‏‮MPEG‬‏4/‏‮WebM‬‏ ‏‮videos‬‏ ‏‮for‬‏ ‏‮animations‬‏ ‏‮and‬‏ ‏‮PNG‬‏/‏‮WebP‬‏ ‏‮for‬‏ ‏‮static‬‏ ‏‮images‬‏ ‏‮instead‬‏ ‏‮of‬‏ ‏‮GIF‬‏ ‏‮to‬‏ ‏‮save‬‏ ‏‮network‬‏ ‏‮bytes‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮fundamentals‬‏/‏‮performance‬‏/‏‮optimizing‬‏-‏‮content‬‏-‏‮efficiency‬‏/‏‮replace‬‏-‏‮animated‬‏-‏‮gifs‬‏-‏‮with‬‏-‏‮video‬‏/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"‏‮Use‬‏ ‏‮video‬‏ ‏‮formats‬‏ ‏‮for‬‏ ‏‮animated‬‏ ‏‮content‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"‏‮Consider‬‏ ‏‮lazy‬‏-‏‮loading‬‏ ‏‮offscreen‬‏ ‏‮and‬‏ ‏‮hidden‬‏ ‏‮images‬‏ ‏‮after‬‏ ‏‮all‬‏ ‏‮critical‬‏ ‏‮resources‬‏ ‏‮have‬‏ ‏‮finished‬‏ ‏‮loading‬‏ ‏‮to‬‏ ‏‮lower‬‏ ‏‮time‬‏ ‏‮to‬‏ ‏‮interactive‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮offscreen‬‏-‏‮images‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"‏‮Defer‬‏ ‏‮offscreen‬‏ ‏‮images‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"‏‮Resources‬‏ ‏‮are‬‏ ‏‮blocking‬‏ ‏‮the‬‏ ‏‮first‬‏ ‏‮paint‬‏ ‏‮of‬‏ ‏‮your‬‏ ‏‮page‬‏. ‏‮Consider‬‏ ‏‮delivering‬‏ ‏‮critical‬‏ ‏‮JS‬‏/‏‮CSS‬‏ ‏‮inline‬‏ ‏‮and‬‏ ‏‮deferring‬‏ ‏‮all‬‏ ‏‮non‬‏-‏‮critical‬‏ ‏‮JS‬‏/‏‮styles‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮blocking‬‏-‏‮resources‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"‏‮Eliminate‬‏ ‏‮render‬‏-‏‮blocking‬‏ ‏‮resources‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"‏‮Large‬‏ ‏‮network‬‏ ‏‮payloads‬‏ ‏‮cost‬‏ ‏‮users‬‏ ‏‮real‬‏ ‏‮money‬‏ ‏‮and‬‏ ‏‮are‬‏ ‏‮highly‬‏ ‏‮correlated‬‏ ‏‮with‬‏ ‏‮long‬‏ ‏‮load‬‏ ‏‮times‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮network‬‏-‏‮payloads‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"‏‮Total‬‏ ‏‮size‬‏ ‏‮was‬‏ {‏‮totalBytes‬‏} ‏‮KB‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"‏‮Avoid‬‏ ‏‮enormous‬‏ ‏‮network‬‏ ‏‮payloads‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"‏‮Avoids‬‏ ‏‮enormous‬‏ ‏‮network‬‏ ‏‮payloads‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"‏‮Minifying‬‏ ‏‮CSS‬‏ ‏‮files‬‏ ‏‮can‬‏ ‏‮reduce‬‏ ‏‮network‬‏ ‏‮payload‬‏ ‏‮sizes‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮minify‬‏-‏‮css‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"‏‮Minify‬‏ ‏‮CSS‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"‏‮Minifying‬‏ ‏‮JavaScript‬‏ ‏‮files‬‏ ‏‮can‬‏ ‏‮reduce‬‏ ‏‮payload‬‏ ‏‮sizes‬‏ ‏‮and‬‏ ‏‮script‬‏ ‏‮parse‬‏ ‏‮time‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮speed‬‏/‏‮docs‬‏/‏‮insights‬‏/‏‮MinifyResources‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"‏‮Minify‬‏ ‏‮JavaScript‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"‏‮Remove‬‏ ‏‮unused‬‏ ‏‮rules‬‏ ‏‮from‬‏ ‏‮stylesheets‬‏ ‏‮to‬‏ ‏‮reduce‬‏ ‏‮unnecessary‬‏ ‏‮bytes‬‏ ‏‮consumed‬‏ ‏‮by‬‏ ‏‮network‬‏ ‏‮activity‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮unused‬‏-‏‮css‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"‏‮Defer‬‏ ‏‮unused‬‏ ‏‮CSS‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"‏‮Remove‬‏ ‏‮unused‬‏ ‏‮JavaScript‬‏ ‏‮to‬‏ ‏‮reduce‬‏ ‏‮bytes‬‏ ‏‮consumed‬‏ ‏‮by‬‏ ‏‮network‬‏ ‏‮activity‬‏."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"‏‮Remove‬‏ ‏‮unused‬‏ ‏‮JavaScript‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"‏‮A‬‏ ‏‮long‬‏ ‏‮cache‬‏ ‏‮lifetime‬‏ ‏‮can‬‏ ‏‮speed‬‏ ‏‮up‬‏ ‏‮repeat‬‏ ‏‮visits‬‏ ‏‮to‬‏ ‏‮your‬‏ ‏‮page‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮cache‬‏-‏‮policy‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ‏‮resource‬‏ ‏‮found‬‏}zero{# ‏‮resources‬‏ ‏‮found‬‏}two{# ‏‮resources‬‏ ‏‮found‬‏}few{# ‏‮resources‬‏ ‏‮found‬‏}many{# ‏‮resources‬‏ ‏‮found‬‏}other{# ‏‮resources‬‏ ‏‮found‬‏}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"‏‮Serve‬‏ ‏‮static‬‏ ‏‮assets‬‏ ‏‮with‬‏ ‏‮an‬‏ ‏‮efficient‬‏ ‏‮cache‬‏ ‏‮policy‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"‏‮Uses‬‏ ‏‮efficient‬‏ ‏‮cache‬‏ ‏‮policy‬‏ ‏‮on‬‏ ‏‮static‬‏ ‏‮assets‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"‏‮Optimized‬‏ ‏‮images‬‏ ‏‮load‬‏ ‏‮faster‬‏ ‏‮and‬‏ ‏‮consume‬‏ ‏‮less‬‏ ‏‮cellular‬‏ ‏‮data‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮optimize‬‏-‏‮images‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"‏‮Efficiently‬‏ ‏‮encode‬‏ ‏‮images‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"‏‮Serve‬‏ ‏‮images‬‏ ‏‮that‬‏ ‏‮are‬‏ ‏‮appropriately‬‏-‏‮sized‬‏ ‏‮to‬‏ ‏‮save‬‏ ‏‮cellular‬‏ ‏‮data‬‏ ‏‮and‬‏ ‏‮improve‬‏ ‏‮load‬‏ ‏‮time‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮oversized‬‏-‏‮images‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"‏‮Properly‬‏ ‏‮size‬‏ ‏‮images‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"‏‮Text‬‏-‏‮based‬‏ ‏‮resources‬‏ ‏‮should‬‏ ‏‮be‬‏ ‏‮served‬‏ ‏‮with‬‏ ‏‮compression‬‏ (‏‮gzip‬‏, ‏‮deflate‬‏ ‏‮or‬‏ ‏‮brotli‬‏) ‏‮to‬‏ ‏‮minimize‬‏ ‏‮total‬‏ ‏‮network‬‏ ‏‮bytes‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮text‬‏-‏‮compression‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"‏‮Enable‬‏ ‏‮text‬‏ ‏‮compression‬‏"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"‏‮Image‬‏ ‏‮formats‬‏ ‏‮like‬‏ ‏‮JPEG‬‏ 2000, ‏‮JPEG‬‏ ‏‮XR‬‏, ‏‮and‬‏ ‏‮WebP‬‏ ‏‮often‬‏ ‏‮provide‬‏ ‏‮better‬‏ ‏‮compression‬‏ ‏‮than‬‏ ‏‮PNG‬‏ ‏‮or‬‏ ‏‮JPEG‬‏, ‏‮which‬‏ ‏‮means‬‏ ‏‮faster‬‏ ‏‮downloads‬‏ ‏‮and‬‏ ‏‮less‬‏ ‏‮data‬‏ ‏‮consumption‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮webp‬‏)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"‏‮Serve‬‏ ‏‮images‬‏ ‏‮in‬‏ ‏‮next‬‏-‏‮gen‬‏ ‏‮formats‬‏"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"‏‮The‬‏ ‏‮Critical‬‏ ‏‮Request‬‏ ‏‮Chains‬‏ ‏‮below‬‏ ‏‮show‬‏ ‏‮you‬‏ ‏‮what‬‏ ‏‮resources‬‏ ‏‮are‬‏ ‏‮loaded‬‏ ‏‮with‬‏ ‏‮a‬‏ ‏‮high‬‏ ‏‮priority‬‏. ‏‮Consider‬‏ ‏‮reducing‬‏ ‏‮the‬‏ ‏‮length‬‏ ‏‮of‬‏ ‏‮chains‬‏, ‏‮reducing‬‏ ‏‮the‬‏ ‏‮download‬‏ ‏‮size‬‏ ‏‮of‬‏ ‏‮resources‬‏, ‏‮or‬‏ ‏‮deferring‬‏ ‏‮the‬‏ ‏‮download‬‏ ‏‮of‬‏ ‏‮unnecessary‬‏ ‏‮resources‬‏ ‏‮to‬‏ ‏‮improve‬‏ ‏‮page‬‏ ‏‮load‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮critical‬‏-‏‮request‬‏-‏‮chains‬‏)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ‏‮chain‬‏ ‏‮found‬‏}zero{# ‏‮chains‬‏ ‏‮found‬‏}two{# ‏‮chains‬‏ ‏‮found‬‏}few{# ‏‮chains‬‏ ‏‮found‬‏}many{# ‏‮chains‬‏ ‏‮found‬‏}other{# ‏‮chains‬‏ ‏‮found‬‏}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"‏‮Minimize‬‏ ‏‮Critical‬‏ ‏‮Requests‬‏ ‏‮Depth‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"‏‮Element‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"‏‮Statistic‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"‏‮Value‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"‏‮Browser‬‏ ‏‮engineers‬‏ ‏‮recommend‬‏ ‏‮pages‬‏ ‏‮contain‬‏ ‏‮fewer‬‏ ‏‮than‬‏ ~1,500 ‏‮DOM‬‏ ‏‮nodes‬‏. ‏‮The‬‏ ‏‮sweet‬‏ ‏‮spot‬‏ ‏‮is‬‏ ‏‮a‬‏ ‏‮tree‬‏ ‏‮depth‬‏ < 32 ‏‮elements‬‏ ‏‮and‬‏ ‏‮fewer‬‏ ‏‮than‬‏ 60 ‏‮children‬‏/‏‮parent‬‏ ‏‮element‬‏. ‏‮A‬‏ ‏‮large‬‏ ‏‮DOM‬‏ ‏‮can‬‏ ‏‮increase‬‏ ‏‮memory‬‏ ‏‮usage‬‏, ‏‮cause‬‏ ‏‮longer‬‏ [‏‮style‬‏ ‏‮calculations‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮fundamentals‬‏/‏‮performance‬‏/‏‮rendering‬‏/‏‮reduce‬‏-‏‮the‬‏-‏‮scope‬‏-‏‮and‬‏-‏‮complexity‬‏-‏‮of‬‏-‏‮style‬‏-‏‮calculations‬‏), ‏‮and‬‏ ‏‮produce‬‏ ‏‮costly‬‏ [‏‮layout‬‏ ‏‮reflows‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮speed‬‏/‏‮articles‬‏/‏‮reflow‬‏). [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮dom‬‏-‏‮size‬‏)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ‏‮node‬‏}zero{# ‏‮nodes‬‏}two{# ‏‮nodes‬‏}few{# ‏‮nodes‬‏}many{# ‏‮nodes‬‏}other{# ‏‮nodes‬‏}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"‏‮Avoid‬‏ ‏‮an‬‏ ‏‮excessive‬‏ ‏‮DOM‬‏ ‏‮size‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"‏‮Maximum‬‏ ‏‮DOM‬‏ ‏‮Depth‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"‏‮Total‬‏ ‏‮DOM‬‏ ‏‮Nodes‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"‏‮Maximum‬‏ ‏‮Child‬‏ ‏‮Elements‬‏"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"‏‮Avoids‬‏ ‏‮an‬‏ ‏‮excessive‬‏ ‏‮DOM‬‏ ‏‮size‬‏"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"‏‮Leverage‬‏ ‏‮the‬‏ ‏‮font‬‏-‏‮display‬‏ ‏‮CSS‬‏ ‏‮feature‬‏ ‏‮to‬‏ ‏‮ensure‬‏ ‏‮text‬‏ ‏‮is‬‏ ‏‮user‬‏-‏‮visible‬‏ ‏‮while‬‏ ‏‮webfonts‬‏ ‏‮are‬‏ ‏‮loading‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮updates‬‏/2016/02/‏‮font‬‏-‏‮display‬‏)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"‏‮Ensure‬‏ ‏‮text‬‏ ‏‮remains‬‏ ‏‮visible‬‏ ‏‮during‬‏ ‏‮webfont‬‏ ‏‮load‬‏"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"‏‮All‬‏ ‏‮text‬‏ ‏‮remains‬‏ ‏‮visible‬‏ ‏‮during‬‏ ‏‮webfont‬‏ ‏‮loads‬‏"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"‏‮Category‬‏"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"‏‮Consider‬‏ ‏‮reducing‬‏ ‏‮the‬‏ ‏‮time‬‏ ‏‮spent‬‏ ‏‮parsing‬‏, ‏‮compiling‬‏ ‏‮and‬‏ ‏‮executing‬‏ ‏‮JS‬‏. ‏‮You‬‏ ‏‮may‬‏ ‏‮find‬‏ ‏‮delivering‬‏ ‏‮smaller‬‏ ‏‮JS‬‏ ‏‮payloads‬‏ ‏‮helps‬‏ ‏‮with‬‏ ‏‮this‬‏."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"‏‮Minimize‬‏ ‏‮main‬‏-‏‮thread‬‏ ‏‮work‬‏"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"‏‮Minimizes‬‏ ‏‮main‬‏-‏‮thread‬‏ ‏‮work‬‏"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"‏‮The‬‏ ‏‮score‬‏ ‏‮above‬‏ ‏‮is‬‏ ‏‮an‬‏ ‏‮estimate‬‏ ‏‮of‬‏ ‏‮how‬‏ ‏‮long‬‏ ‏‮your‬‏ ‏‮app‬‏ ‏‮takes‬‏ ‏‮to‬‏ ‏‮respond‬‏ ‏‮to‬‏ ‏‮user‬‏ ‏‮input‬‏, ‏‮in‬‏ ‏‮milliseconds‬‏, ‏‮during‬‏ ‏‮the‬‏ ‏‮busiest‬‏ 5‏‮s‬‏ ‏‮window‬‏ ‏‮of‬‏ ‏‮page‬‏ ‏‮load‬‏. ‏‮If‬‏ ‏‮your‬‏ ‏‮latency‬‏ ‏‮is‬‏ ‏‮higher‬‏ ‏‮than‬‏ 50 ‏‮ms‬‏, ‏‮users‬‏ ‏‮may‬‏ ‏‮perceive‬‏ ‏‮your‬‏ ‏‮app‬‏ ‏‮as‬‏ ‏‮laggy‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮estimated‬‏-‏‮input‬‏-‏‮latency‬‏)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"‏‮Estimated‬‏ ‏‮Input‬‏ ‏‮Latency‬‏"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"‏‮First‬‏ ‏‮Contentful‬‏ ‏‮Paint‬‏ ‏‮marks‬‏ ‏‮the‬‏ ‏‮time‬‏ ‏‮at‬‏ ‏‮which‬‏ ‏‮the‬‏ ‏‮first‬‏ ‏‮text‬‏ ‏‮or‬‏ ‏‮image‬‏ ‏‮is‬‏ ‏‮painted‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮first‬‏-‏‮contentful‬‏-‏‮paint‬‏)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"‏‮First‬‏ ‏‮Contentful‬‏ ‏‮Paint‬‏"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"‏‮First‬‏ ‏‮CPU‬‏ ‏‮Idle‬‏ ‏‮marks‬‏ ‏‮the‬‏ ‏‮first‬‏ ‏‮time‬‏ ‏‮at‬‏ ‏‮which‬‏ ‏‮the‬‏ ‏‮page‬‏'‏‮s‬‏ ‏‮main‬‏ ‏‮thread‬‏ ‏‮is‬‏ ‏‮quiet‬‏ ‏‮enough‬‏ ‏‮to‬‏ ‏‮handle‬‏ ‏‮input‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮first‬‏-‏‮interactive‬‏)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"‏‮First‬‏ ‏‮CPU‬‏ ‏‮Idle‬‏"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"‏‮First‬‏ ‏‮Meaningful‬‏ ‏‮Paint‬‏ ‏‮measures‬‏ ‏‮when‬‏ ‏‮the‬‏ ‏‮primary‬‏ ‏‮content‬‏ ‏‮of‬‏ ‏‮a‬‏ ‏‮page‬‏ ‏‮is‬‏ ‏‮visible‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮first‬‏-‏‮meaningful‬‏-‏‮paint‬‏)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"‏‮First‬‏ ‏‮Meaningful‬‏ ‏‮Paint‬‏"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"‏‮Interactive‬‏ ‏‮marks‬‏ ‏‮the‬‏ ‏‮time‬‏ ‏‮at‬‏ ‏‮which‬‏ ‏‮the‬‏ ‏‮page‬‏ ‏‮is‬‏ ‏‮fully‬‏ ‏‮interactive‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮consistently‬‏-‏‮interactive‬‏)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"‏‮Time‬‏ ‏‮to‬‏ ‏‮Interactive‬‏"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"‏‮Speed‬‏ ‏‮Index‬‏ ‏‮shows‬‏ ‏‮how‬‏ ‏‮quickly‬‏ ‏‮the‬‏ ‏‮contents‬‏ ‏‮of‬‏ ‏‮a‬‏ ‏‮page‬‏ ‏‮are‬‏ ‏‮visibly‬‏ ‏‮populated‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮speed‬‏-‏‮index‬‏)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"‏‮Speed‬‏ ‏‮Index‬‏"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"‏‮Redirects‬‏ ‏‮introduce‬‏ ‏‮additional‬‏ ‏‮delays‬‏ ‏‮before‬‏ ‏‮the‬‏ ‏‮page‬‏ ‏‮can‬‏ ‏‮be‬‏ ‏‮loaded‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮redirects‬‏)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"‏‮Avoid‬‏ ‏‮multiple‬‏ ‏‮page‬‏ ‏‮redirects‬‏"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"‏‮Time‬‏ ‏‮To‬‏ ‏‮First‬‏ ‏‮Byte‬‏ ‏‮identifies‬‏ ‏‮the‬‏ ‏‮time‬‏ ‏‮at‬‏ ‏‮which‬‏ ‏‮your‬‏ ‏‮server‬‏ ‏‮sends‬‏ ‏‮a‬‏ ‏‮response‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮ttfb‬‏)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"‏‮Root‬‏ ‏‮document‬‏ ‏‮took‬‏ {‏‮timeInMs‬‏} ‏‮ms‬‏"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"‏‮Reduce‬‏ ‏‮server‬‏ ‏‮response‬‏ ‏‮times‬‏ (‏‮TTFB‬‏)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"‏‮Server‬‏ ‏‮response‬‏ ‏‮times‬‏ ‏‮are‬‏ ‏‮low‬‏ (‏‮TTFB‬‏)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"‏‮Duration‬‏"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"‏‮Name‬‏"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"‏‮Start‬‏ ‏‮Time‬‏"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"‏‮Type‬‏"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"‏‮Consider‬‏ ‏‮instrumenting‬‏ ‏‮your‬‏ ‏‮app‬‏ ‏‮with‬‏ ‏‮the‬‏ ‏‮User‬‏ ‏‮Timing‬‏ ‏‮API‬‏ ‏‮to‬‏ ‏‮measure‬‏ ‏‮your‬‏ ‏‮app‬‏'‏‮s‬‏ ‏‮real‬‏-‏‮world‬‏ ‏‮performance‬‏ ‏‮during‬‏ ‏‮key‬‏ ‏‮user‬‏ ‏‮experiences‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮user‬‏-‏‮timing‬‏)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ‏‮user‬‏ ‏‮timing‬‏}zero{# ‏‮user‬‏ ‏‮timings‬‏}two{# ‏‮user‬‏ ‏‮timings‬‏}few{# ‏‮user‬‏ ‏‮timings‬‏}many{# ‏‮user‬‏ ‏‮timings‬‏}other{# ‏‮user‬‏ ‏‮timings‬‏}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"‏‮User‬‏ ‏‮Timing‬‏ ‏‮marks‬‏ ‏‮and‬‏ ‏‮measures‬‏"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"‏‮Consider‬‏ ‏‮adding‬‏ ‏‮preconnect‬‏ ‏‮or‬‏ ‏‮dns‬‏-‏‮prefetch‬‏ ‏‮resource‬‏ ‏‮hints‬‏ ‏‮to‬‏ ‏‮establish‬‏ ‏‮early‬‏ ‏‮connections‬‏ ‏‮to‬‏ ‏‮important‬‏ ‏‮third‬‏-‏‮party‬‏ ‏‮origins‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮fundamentals‬‏/‏‮performance‬‏/‏‮resource‬‏-‏‮prioritization‬‏#‏‮preconnect‬‏)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"‏‮Preconnect‬‏ ‏‮to‬‏ ‏‮required‬‏ ‏‮origins‬‏"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"‏‮Consider‬‏ ‏‮using‬‏ <link rel=preload> ‏‮to‬‏ ‏‮prioritize‬‏ ‏‮fetching‬‏ ‏‮resources‬‏ ‏‮that‬‏ ‏‮are‬‏ ‏‮currently‬‏ ‏‮requested‬‏ ‏‮later‬‏ ‏‮in‬‏ ‏‮page‬‏ ‏‮load‬‏. [‏‮Learn‬‏ ‏‮more‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/‏‮audits‬‏/‏‮preload‬‏)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"‏‮Preload‬‏ ‏‮key‬‏ ‏‮requests‬‏"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"‏‮More‬‏ ‏‮information‬‏ ‏‮about‬‏ ‏‮the‬‏ ‏‮performance‬‏ ‏‮of‬‏ ‏‮your‬‏ ‏‮application‬‏."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"‏‮Diagnostics‬‏"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"‏‮The‬‏ ‏‮most‬‏ ‏‮critical‬‏ ‏‮aspect‬‏ ‏‮of‬‏ ‏‮performance‬‏ ‏‮is‬‏ ‏‮how‬‏ ‏‮quickly‬‏ ‏‮pixels‬‏ ‏‮are‬‏ ‏‮rendered‬‏ ‏‮onscreen‬‏. ‏‮Key‬‏ ‏‮metrics‬‏: ‏‮First‬‏ ‏‮Contentful‬‏ ‏‮Paint‬‏, ‏‮First‬‏ ‏‮Meaningful‬‏ ‏‮Paint‬‏"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"‏‮First‬‏ ‏‮Paint‬‏ ‏‮Improvements‬‏"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"‏‮These‬‏ ‏‮optimizations‬‏ ‏‮can‬‏ ‏‮speed‬‏ ‏‮up‬‏ ‏‮your‬‏ ‏‮page‬‏ ‏‮load‬‏."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"‏‮Opportunities‬‏"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"‏‮Metrics‬‏"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"‏‮Enhance‬‏ ‏‮the‬‏ ‏‮overall‬‏ ‏‮loading‬‏ ‏‮experience‬‏, ‏‮so‬‏ ‏‮the‬‏ ‏‮page‬‏ ‏‮is‬‏ ‏‮responsive‬‏ ‏‮and‬‏ ‏‮ready‬‏ ‏‮to‬‏ ‏‮use‬‏ ‏‮as‬‏ ‏‮soon‬‏ ‏‮as‬‏ ‏‮possible‬‏. ‏‮Key‬‏ ‏‮metrics‬‏: ‏‮Time‬‏ ‏‮to‬‏ ‏‮Interactive‬‏, ‏‮Speed‬‏ ‏‮Index‬‏"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"‏‮Overall‬‏ ‏‮Improvements‬‏"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"‏‮Performance‬‏"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"‏‮Cache‬‏ ‏‮TTL‬‏"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"‏‮Size‬‏ (‏‮KB‬‏)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"‏‮Time‬‏ ‏‮Spent‬‏"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"‏‮URL‬‏"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"‏‮Potential‬‏ ‏‮Savings‬‏ (‏‮KB‬‏)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"‏‮Potential‬‏ ‏‮Savings‬‏ (‏‮ms‬‏)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"‏‮Potential‬‏ ‏‮savings‬‏ ‏‮of‬‏ {‏‮wastedBytes‬‏} ‏‮KB‬‏"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"‏‮Potential‬‏ ‏‮savings‬‏ ‏‮of‬‏ {‏‮wastedMs‬‏} ‏‮ms‬‏"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{‏‮timeInMs‬‏} ‏‮ms‬‏"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{‏‮timeInMsSec‬‏} ‏‮s‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"‏‮Show‬‏ ‏‮audits‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"‏‮Initial‬‏ ‏‮Navigation‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"‏‮Maximum‬‏ ‏‮critical‬‏ ‏‮path‬‏ ‏‮latency‬‏:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"‏‮Error‬‏!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"‏‮Report‬‏ ‏‮error‬‏: ‏‮no‬‏ ‏‮audit‬‏ ‏‮information‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"‏‮Lab‬‏ ‏‮Data‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[‏‮Lighthouse‬‏](‏‮https‬‏://‏‮developers‬‏.‏‮google‬‏.‏‮com‬‏/‏‮web‬‏/‏‮tools‬‏/‏‮lighthouse‬‏/) ‏‮analysis‬‏ ‏‮of‬‏ ‏‮the‬‏ ‏‮current‬‏ ‏‮page‬‏ ‏‮on‬‏ ‏‮emulated‬‏ 3‏‮G‬‏. ‏‮Values‬‏ ‏‮are‬‏ ‏‮estimated‬‏ ‏‮and‬‏ ‏‮may‬‏ ‏‮vary‬‏."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"‏‮Additional‬‏ ‏‮items‬‏ ‏‮to‬‏ ‏‮manually‬‏ ‏‮check‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"‏‮Not‬‏ ‏‮applicable‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"‏‮Opportunity‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"‏‮Estimated‬‏ ‏‮Savings‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"‏‮Passed‬‏ ‏‮audits‬‏"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"‏‮Score‬‏ ‏‮scale‬‏:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"‏‮There‬‏ ‏‮were‬‏ ‏‮issues‬‏ ‏‮affecting‬‏ ‏‮this‬‏ ‏‮run‬‏ ‏‮of‬‏ ‏‮Lighthouse‬‏:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"‏‮Values‬‏ ‏‮are‬‏ ‏‮estimated‬‏ ‏‮and‬‏ ‏‮may‬‏ ‏‮vary‬‏."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"‏‮Warnings‬‏: "}};
+
+
+},{}],39:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"أثّرت \"إضافات Chrome\" بشكلٍ سلبي في أداء التحميل لهذه الصفحة. ويمكنك تجربة تدقيق الصفحة في وضع التصفُّح المُتخفّي أو من ملف شخصي على Chrome بدون الإضافات."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"تقييم النص البرمجي"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"تحليل النص البرمجي"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"الإجمالي"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"يمكنك تقليل الوقت المستغرق في تحليل جافا سكريبت وإنشائه وتنفيذه. قد يتبين لك أن تسليم أحمال جافا سكريبت بحجم أصغر يساعد في ذلك. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"تقليل وقت تنفيذ جافا سكريبت"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"وقت تنفيذ جافا سكريبت"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"لا تكفي ملفات GIF الكبيرة لتسليم محتوى صور متحركة. لذا يمكنك استخدام فيديوهات MPEG4 / WebM للصور المتحركة وملفات PNG / WebP للصور الثابتة بدلاً من ملفات GIF لحفظ وحدات البايت للشبكة. [مزيد من المعلومات](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"استخدام تنسيقات الفيديو لمحتوى الصور المتحركة"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"خُذ بعين الاعتبار التحميل البطئ خارج الشاشة والصور المخفية بعد الانتهاء من تحميل جميع الموارد المهمة في وقت أقل تفاعلية. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"تأجيل الصور خارج الشاشة"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"تحظر الموارد العرض الأول لصفحتك. ويمكنك تسليم تضمين JS / CSS المهم وتأجيل كل الأنماط/جافا سكريبت غير المهمة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"استبعاد موارد حظر العرض"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"تُكلِّف أحمال الشبكة الكبيرة المستخدمين الكثير من الأموال وترتبط مباشرةً بأوقات التحميل الطويلة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"كان إجمالي الحجم {totalBytes, number, bytes} كيلوبايت"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"تجنُّب الأحمال الضخمة للشبكة"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"تجنُّب الأحمال الضخمة للشبكة"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"يمكن أن يؤدي تصغير ملفات CSS إلى تقليل أحجام حمولة الشبكة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"تصغير CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"يمكن أن يؤدي تصغير ملفات جافا سكريبت إلى تقليل أحجام الأحمال ووقت تحليل النص البرمجي. [مزيد من المعلومات](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"تصغير جافا سكريبت"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"يمكنك إزالة القواعد غير المُستخدَمة من ورق الأنماط لتقليل وحدات البايت غير الضرورية التي يستهلكها نشاط الشبكة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"تأجيل CSS غير المُستخدَم"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"يمكنك إزالة جافا سكريبت غير المُستخدَم لتقليل وحدات البايت التي يستهلكها نشاط الشبكة."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"إزالة جافا سكريبت غير المستخدم"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"يمكن لفترة التخزين المؤقت الطويلة تسريع عملية تكرار الزيارات إلى صفحتك. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{تم العثور على مورد واحد}zero{تم العثور على # مورد}two{تم العثور على مورديْنِ (#)}few{تم العثور على # موارد}many{تم العثور على # موردًا}other{تم العثور على # مورد}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"عرض الأصول الثابتة من خلال سياسة ذاكرة التخزين المؤقت الفعالة"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"استخدام سياسة ذاكرة التخزين المؤقت الفعالة على الأصول الثابتة"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"يتم تحميل الصور المحسَّنة بشكلٍ أسرع وتستهلك بيانات أقل لشبكة الجوّال. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"تشفير الصور بكفاءة"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"يمكنك عرض صور بحجم مناسب لحفظ بيانات شبكة الجوّال وتحسين وقت التحميل. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"الصور ذات الحجم المناسب"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"يجب عرض الموارد المستندة إلى النص باستخدام الضغط (gzip أو الانكماش أو brotli) لتقليل إجمالي وحدات البايت للشبكة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"تفعيل ضغط النص"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"غالبًا ما توفِّر تنسيقات الصور، مثل JPEG 2000 وJPEG XR وWebP، ضغطًا أفضل من تنسيق PNG أو JPEG، وهذا بدوره يعني تنزيلاً أسرع واستهلاكًا أقل للبيانات. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"عرض الصور بتنسيقات الجيل القادم"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"توضح لك \"سلاسل الطلبات المهمة\" أدناه الموارد التي تم تحميلها بأولوية عالية. ويمكنك تقليل طول السلاسل أو تقليل حجم تنزيل الموارد أو تأجيل تنزيل الموارد غير الضرورية لتحسين تحميل الصفحة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{تم العثور على سلسلة واحدة}zero{تم العثور على # سلسلة}two{تم العثور على سلسلتيْنِ (#)}few{تم العثور على # سلاسل}many{تم العثور على # سلسلةً}other{تم العثور على # سلسلة}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"تقليل عمق الطلبات المهمة"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"يوصي مهندسو المتصفّح بالصفحات التي تحتوي على أقل من ~1500 عُقدة DOM. وتمثل sweet spot شبكة عمقها < 32 عنصرًا ولا تزيد عن 60 عنصرًا فرعيًا/رئيسيًا. ويمكن أن تزيد عُقدة DOM الكبيرة من استخدام الذاكرة، وتسبب [عمليات حسابية نمطية] أطول (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations)، وتنتج [عمليات إعادة عرض للتنسيق] مُكلفة (https://developers.google.com/speed/articles/reflow). [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{عقدة واحدة}zero{# عقدة}two{عقدتان (#)}few{# عُقَد}many{# عقدةً}other{# عقدة}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"تجنُب حجم DOM الزائد"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"الحد الأقصى لعمق DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"إجمالى عُقَدْ DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"تجنُب حجم DOM الزائد"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"يمكنك الاستفادة من ميزة CSS لعرض الخطوط لضمان أن يكون النص مرئيًا للمستخدم أثناء تحميل خطوط موقع ويب. [مزيد من المعلومات](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"التأكد من بقاء النص مرئيًا أثناء تحميل خط موقع ويب"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"تظل جميع النصوص مرئية أثناء تحميل خط موقع ويب"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"الفئة"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"يمكنك تقليل الوقت المستغرق في تحليل جافا سكريبت وإنشائه وتنفيذه. قد يتبين لك أن تسليم أحمال جافا سكريبت بحجم أصغر يساعد في ذلك."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"تقليل سلسلة العمل الرئيسية"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"تقليل سلسلة العمل الرئيسية"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"إن النتيجة الواردة أعلاه تمثل تقديرًا لطول المدة التي يستغرقها تطبيقك في الاستجابة لإدخال المستخدم، بالمللي ثانية، أثناء فترة تحميل الصفحة الأكثر انشغالاً خلال 5 ثوانٍ. إذا كان وقت الاستجابة أكثر من 50 مللي ثانية، يمكن للمستخدمين اعتبار تطبيقك بأنه \"بطيء في التفاعل\". [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"وقت الاستجابة المُقدّر للإدخال"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"تحدد \"سرعة عرض المحتوى على الصفحة\" الوقت الذي يُعرَض فيه أول صورة أو نص. [مزيد من المعلومات](https://developers.google.com/web/fundamentals/performance/user-centric-performance-metrics#first_paint_and_first_contentful_paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"First Contentful Paint"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"تشير \"وحدة المعالجة المركزية الأولى الخاملة\" إلى المرة الأولى التي تكون فيها السلسلة الرئيسية للصفحة كافية للتعامل مع الإدخال. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"وحدة المعالجة المركزية الأولى الخاملة"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"يقيس First Meaningful Paint الوقت الذي يكون فيه المحتوى الأساسي لصفحة مرئيًا. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"First Meaningful Paint"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"يميّز \"الوضع التفاعلي\" الوقت الذي تكون فيه الصفحة تفاعلية بالكامل. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"وقت التفاعل"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"يوضح مؤشر السرعة مدى سرعة تعبئة محتوى الصفحة بشكلٍ واضح. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"مؤشر السرعة"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"تؤدي عمليات إعادة التوجيه إلى حدوث تأخيرات إضافية قبل أن يتم تحميل الصفحة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"تجنُب عمليات إعادة توجيه الصفحات المتعددة"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"يحدد \"وقت وصول أول بايت\" الوقت الذي يُرسل فيه الخادم استجابة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"استغرق مستند الجذر {timeInMs, number, milliseconds} مللي ثانية."},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"تقليل أوقات استجابة الخادم (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"أوقات استجابة الخادم منخفضة (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"المدة"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"الاسم"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"وقت البدء"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"النوع"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"يمكنك توجيه تطبيقك باستخدام \"واجهة برمجة التطبيقات لأوقات المستخدم\" لقياس الأداء الفعلي لتطبيقك أثناء التجارب الأساسية للمستخدمين. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{وقت واحد للمستخدم}zero{# وقت للمستخدم}two{وقتا (#) المستخدم}few{# أوقات للمستخدم}many{# وقتًا للمستخدم}other{# وقت للمستخدم}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"علامات أوقات المستخدم وقياساتها"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"يمكنك إضافة الاتصال المسبق أو تعديلات موارد الجلب المسبق لنظام أسماء النطاقات لإنشاء اتصالات مبكرة بأصول مهمة تابعة لجهة خارجية. [مزيد من المعلومات](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"الاتصال المسبق للأصول المطلوبة"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"يمكنك استخدام <link rel = preload> لتحديد أولويات جلب الموارد المطلوبة حاليًا في وقتٍ لاحق في تحميل الصفحة. [مزيد من المعلومات](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"التحميل المسبق للطلبات الأساسية"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"مزيد من المعلومات حول أداء تطبيقك."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"بيانات التشخيص"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"يمثل الجانب الأكثر أهمية للأداء مدى السرعة التي يتم بها عرض وحدات البكسل على الشاشة. المقاييس الرئيسية: First Contentful Paint وFirst Meaningful Paint"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"تحسينات العرض الأول"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"يمكن لهذه التحسينات تسريع عملية تحميل الصفحة."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"فرص تحسين الأداء"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"المقاييس"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"يمكنك تحسين تجربة التحميل العامة لتصبح هذه الصفحة سريعة الاستجابة وجاهزة للاستخدام في أقرب وقت ممكن. المقاييس الأساسية: وقت التفاعل ومؤشر السرعة."},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"التحسينات العامة"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"الأداء"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"ذاكرة التخزين المؤقت TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"الحجم (كيلوبايت)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"الوقت المستغرَق"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"عنوان URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"التوفيرات المحتملة (كيلوبايت)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"التوفيرات المحتملة (مللي ثانية)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"التوفيرات المحتملة من {wastedBytes, number, bytes} كيلوبايت"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"التوفيرات المحتملة لـ {wastedMs, number, milliseconds} مللي ثانية"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} مللي ثانية"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} ثانية"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"عرض عمليات التدقيق"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"التنقل الأوّلي"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"الحد الأقصى لوقت استجابة المسار المهم:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"خطأ!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"الإبلاغ عن خطأ: لا تتوفَّر معلومات تدقيق"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"بيانات المختبَر"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) تحليل الصفحة الحالية على شبكة الجيل الثالث في وضع المحاكاة. القيم تقديرية وقابلة للتغيير."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"عناصر إضافية للتحقُّق يدويًا"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"غير سارٍ"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"فرصة تحسين الأداء"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"التوفيرات المُقدرة"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"اجتياز عمليات التدقيق بنجاح"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"مقياس النتيجة:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"حدثت مشاكل تؤثر في تشغيل Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"القيم تقديرية وقابلة للتغير"},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"التحذيرات: "}};
+
+
+},{}],40:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Зареждането на тази страница се забавя от разширения за Chrome. Опитайте да я проверите в режим „инкогнито“ или от потребителски профил в Chrome без инсталирани разширения."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Проверка на скрипта"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Синтактичен анализ на скрипта"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Общо"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Препоръчваме да намалите времето, прекарвано в синтактичен анализ, компилиране и изпълнение на JS. Използването на JS ресурси с по-малък размер може да помогне за това. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Намалете времето за изпълнение на JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Време за изпълнение на JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Големите GIF файлове не са ефективни за показване на анимирано съдържание. Вместо това препоръчваме да използвате видеоклипове във формат MPEG4/WebM за анимации и PNG/WebP за статични изображения, за да намалите преноса на данни. [Научете повече](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Използвайте видеоформати за анимираното съдържание"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"За да намалите времето до интерактивност, препоръчваме скритите изображения и тези извън видимата част на екрана да се зареждат след всички критични ресурси. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Отложете зареждането на изображенията извън видимата част на екрана"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Ресурси блокират първото изобразяване на страницата ви. Препоръчваме да вградите критичните JS/CSS елементи и да отложите зареждането на всички некритични JS/стилове. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Елиминирайте ресурсите, които блокират изобразяването"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Мрежовите ресурси с голям размер струват пари на потребителите и са тясно свързани с бавното зареждане. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Общият размер бе {totalBytes, number, bytes} КБ"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Не използвайте мрежови ресурси с голям размер"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Не се използват мрежови ресурси с голям размер"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Минимизирането на файловете със CSS може да намали размера на мрежовите ресурси. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Минимизирайте CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Минимизирането на файловете с JavaScript може да намали размера на ресурсите и времето за синтактичен анализ на скрипта. [Научете повече](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Минимизирайте JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Премахнете неизползваните правила от стиловите листове, за да намалите ненужния пренос на данни при мрежовата активност. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Отложете зареждането на неизползваните CSS стилове"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Премахнете неизползвания JavaScript, за да намалите преноса на данни при мрежовата активност."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Премахнете неизползвания JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Продължителното съхраняване на кеша може да ускори повторните посещения на страницата ви. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Намерен е 1 ресурс}other{Намерени са # ресурса}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Използвайте ефективни правила за кеша, за да улесните показването на статичните активи"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Използват се ефективни правила за кеширане на статичните активи"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Оптимизираните изображения се зареждат по-бързо и използват по-малко мобилни данни. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Кодирайте изображенията ефективно"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Показвайте правилно оразмерени изображения, за да пестите мобилни данни и да ускорите зареждането. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Оразмерете изображенията правилно"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"При показването на текстови ресурси трябва да се използва компресиране (gzip, deflate или brotli), за да се намали общият пренос на данни. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Активирайте компресирането на текста"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Графичните формати, като JPEG 2000, JPEG XR и WebP, често осигуряват по-ефективно компресиране от PNG или JPEG. Това означава по-бързо изтегляне и използване на по-малко данни. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Използвайте съвременни формати за показване на изображения"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Веригите от критични заявки по-долу ви показват кои ресурси се зареждат с висок приоритет. За да ускорите зареждането на страницата, препоръчваме да скъсите веригите, да намалите размера за изтегляне на ресурсите или да отложите изтеглянето на ненужните от тях. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Намерена е 1 верига}other{Намерени са # вериги}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Намалете дълбочината на критичните заявки"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Браузърните инженери препоръчват страниците да съдържат под ~ 1500 възела на DOM. Най-добре е йерархичната структура да е с дълбочина под 32 елемента и всеки родителски елемент да има по-малко от 60 дъщерни. Големият размер на DOM може да доведе до използване на повече памет, удължаване на [стиловите изчисления](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) и забавяне поради [преоформяне](https://developers.google.com/speed/articles/reflow). [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 възел}other{# възела}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Не използвайте DOM с твърде голям размер"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Максимална дълбочина на DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Общ брой възли на DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Не се използва DOM с твърде голям размер"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Използвайте функцията font-display на CSS, така че текстът да е видим за потребителите при зареждането на уеб шрифтовете. [Научете повече](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Уверете се, че текстът остава видим при зареждането на уеб шрифтовете"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Целият текст остава видим при зареждането на уеб шрифтовете"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Категория"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Препоръчваме да намалите времето, прекарвано в синтактичен анализ, компилиране и изпълнение на JS. Използването на JS ресурси с по-малък размер може да помогне за това."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Сведете до минимум работата по основната нишка"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Работата по основната нишка е сведена до минимум"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Резултатът по-горе показва приблизително колко време (в милисекунди) е необходимо на приложението ви, за да реагира на входящо потребителско действие по време на най-натоварения 5-секунден период от зареждането на страницата. Ако забавянето е над 50 мсек, приложението ви може да се стори бавно на потребителите. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Прогнозно забавяне при входящо действие"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Показателят „Първо изобразяване на съдържание (FCP)“ указва след колко време се изобразява първият текстов или графичен елемент. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Първо изобразяване на съдържание"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Показателят „Първи момент на неактивност на процесора“ указва първия момент, в който основната нишка на страницата е достатъчно свободна, за да обработва входящи действия. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Първи момент на неактивност на процесора"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Показателят „Първо значимо изобразяване“ измерва времето, за което основното съдържание на страницата става видимо. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Първо значимо изобразяване"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Показателят „Време до интерактивност“ указва колко време отнема постигането на пълна интерактивност за страницата. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Време до интерактивност"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Индексът на скоростта показва колко бързо се постига визуална завършеност на страницата. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Индекс на скоростта"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Пренасочванията водят до допълнително забавяне на зареждането на страницата. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Не използвайте пренасочвания през няколко страници"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Показателят „Време до първия байт“ указва след колко време сървърът изпраща отговор. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Основният документ отне {timeInMs, number, milliseconds} мсек"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Намалете времето за отговор от сървъра (време до първия байт)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Сървърът отговаря бързо (време до първия байт)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Продължителност"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Име"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Начален час"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Тип"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Препоръчваме да използвате API за разбивка на потребителските времена за приложението си, за да измервате действителната му ефективност по време на ключови аспекти от практическата работа на потребителите. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 потребителско време}other{# потребителски времена}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Точки и измервания в разбивката на потребителските времена"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Препоръчваме да добавите подсказки за предварително свързване или предварително извличане на DNS за ресурсите с цел ранно установяване на връзка с важни източници на трети страни. [Научете повече](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Осигурете предварително свързване с необходимите източници"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Препоръчваме да използвате <link rel=preload>, за да укажете най-напред да се извличат ресурсите, които понастоящем се заявяват на по-късен етап от зареждането на страницата. [Научете повече](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Задайте ключовите заявки да се зареждат предварително"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Повече информация за ефективността на приложението ви."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Диагностика"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Най-критичният аспект на ефективността е времето, за което пикселите се изобразяват на екрана. Ключови показатели: първо изобразяване на съдържание, първо значимо изобразяване"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Подобрения, свързани с първото изобразяване"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Тези оптимизации могат да ускорят зареждането на страницата."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Възможности"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Показатели"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Подобрете зареждането като цяло, така че страницата да реагира бързо и да е готова за използване възможно най-скоро. Ключови показатели: време до интерактивност, индекс на скоростта"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Цялостни подобрения"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Ефективност"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Време на валидност на кеша"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Размер (КБ)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Прекарано време"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL адрес"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Потенциална икономия (КБ)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Потенциална икономия (мсек)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Потенциално спестяване на {wastedBytes, number, bytes} КБ"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Потенциално спестяване на {wastedMs, number, milliseconds} мсек"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} мсек"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} сек"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Показване на проверките"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Първоначална навигация"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Максимално забавяне в критичния път:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Грешка!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Грешка в отчета: няма информация за проверката"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Данни от контролиран тест"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Анализът с [Lighthouse](https://developers.google.com/web/tools/lighthouse/) на текущата страница бе извършен през емулирана 3G връзка. Стойностите са прогнозни и може да варират."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Допълнителни елементи, които да проверите ръчно"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Не е приложимо"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Възможност"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Прогнозна икономия"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Успешно преминати проверки"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Скала на резултата:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Възникнаха проблеми при изготвянето на този отчет от Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Стойностите са прогнозни и може да варират."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Предупреждения: "}};
+
+
+},{}],41:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Les extensions de Chrome han afectat negativament el rendiment de càrrega de la pàgina. Audita la pàgina en mode d'incògnit o des d'un perfil de Chrome sense extensions."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Avaluació de scripts"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Anàlisi de scripts"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Et recomanem que redueixis el temps dedicat a analitzar, compilar i executar JavaScript. Et pot ajudar utilitzar càrregues útils de JavaScript més petites. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Redueix el temps d'execució de JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Temps d'execució de JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Els GIF grans no són eficients a l'hora de publicar contingut animat. Per estalviar bytes de la xarxa, pots substituir-los per vídeos MPEG4/WebM en el cas d'animacions i per PNG/WebP en el cas d'imatges estàtiques. [Més informació] (https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Utilitza formats de vídeo per al contingut animat"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Et recomanem que utilitzis la càrrega diferida de les imatges ocultes i que no es mostren a la pantalla un cop s'acabin de carregar tots els recursos crítics a fi de reduir el temps necessari perquè la pàgina sigui interactiva. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Ajorna les imatges fora de pantalla"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Els recursos estan bloquejant la primera renderització de la pàgina. Et recomanem que publiquis els fitxers JavaScript o CSS inserits i ajornis tots els estils i els fitxers JavaScript que no siguin crítics. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Elimina els recursos que bloquegen la renderització"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Si la càrrega útil de la xarxa és molt gran, els usuaris consumeixen més dades mòbils i els temps de càrrega són més llargs. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Mida total: {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Evita càrregues útils de xarxa enormes"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Evita càrregues útils de xarxa enormes"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Reduir els fitxers CSS pot disminuir les mides de càrrega útil a la xarxa. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Redueix els CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Reduir els fitxers JavaScript pot disminuir les mides de càrrega i els temps d'anàlisi de scripts. [Més informació] (https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Redueix els fitxers JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Suprimeix dels fulls d'estil les regles que no s'utilitzen per reduir els bytes que es consumeixen de manera innecessària durant l'activitat de la xarxa. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Ajorna els CSS no utilitzats"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Suprimeix els fitxers JavaScript que no s'utilitzen per reduir els bytes que es consumeixen durant l'activitat de la xarxa."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Suprimeix els fitxers JavaScript no utilitzats"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Si la memòria cau té una vida llarga, es poden accelerar les visites repetides a la teva pàgina. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{S'ha trobat 1 recurs}other{S'han trobat # recursos}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Publica recursos estàtics amb una política de memòria cau eficient"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Utilitza una política de memòria cau eficient per als recursos estàtics"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Les imatges optimitzades es carreguen més ràpidament i utilitzen menys dades mòbils. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Codifica les imatges amb eficiència"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Publica imatges amb la mida correcta per estalviar dades mòbils i millorar el temps de càrrega. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Adapta la mida de les imatges"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Els recursos basats en text s'han de publicar comprimits (gzip, deflate o brotli) per minimitzar el total de bytes a la xarxa. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Activa la compressió de text"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Els formats d'imatge com JPEG 2000, JPEG XR i WebP solen oferir millors resultats de compressió que PNG o JPEG. Això implica baixades més ràpides i menys consum de dades. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Publica imatges en format d'última generació"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Les cadenes de sol·licituds crítiques de sota et mostren quins recursos es carreguen amb prioritat alta. Et recomanem que escurcis les cadenes, redueixis la mida de baixada dels recursos o ajornis la baixada de recursos innecessaris per millorar la càrrega de pàgines. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{S'ha trobat 1 cadena}other{S'han trobat # cadenes}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimitza la profunditat de les sol·licituds crítiques"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Els enginyers de navegadors recomanen que les pàgines continguin menys d'uns 1.500 nodes de DOM. La situació ideal és una profunditat d'arbre inferior a 32 elements i menys de 60 elements superiors o secundaris. Un DOM gran pot augmentar l'ús de la memòria, provocar [càlculs d'estil] més llargs (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) i produir costosos [reinicis de reflux del disseny] (https://developers.google.com/speed/articles/reflow). [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 node}other{# nodes}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Evita una mida de DOM excessiva"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Profunditat màxima de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Total de nodes de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Evita una mida excessiva de DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Aprofita la funció CSS que permet mostrar els tipus de lletra per assegurar-te que els usuaris puguin veure el text mentre es carreguen els tipus de lletra per a llocs web. [Més informació] (https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Assegura't que el text continuï visible durant la càrrega dels tipus de lletra per a llocs web"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Tot el text continua visible durant les càrregues dels tipus de lletra per a llocs web"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Categoria"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Et recomanem que redueixis el temps dedicat a analitzar, compilar i executar JavaScript. Et pot ajudar utilitzar càrregues útils de JavaScript més petites."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimitza el treball al fil principal"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimitza el treball al fil principal"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"La puntuació de més amunt és una estimació de quant tarda en mil·lisegons la teva aplicació a respondre a una acció de l'usuari durant el període de 5 segons amb més càrregues de pàgines. Si la latència és superior a 50 ms, és possible que els usuaris considerin que l'aplicació és lenta. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Latència estimada de les accions"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"La primera renderització de contingut marca el moment en què es renderitza el primer text o la primera imatge. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Primera renderització de contingut"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"La mètrica Primera inactivitat de la CPU marca el primer moment en què el fil principal de la pàgina està suficientment inactiu per gestionar accions. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Primera inactivitat de la CPU"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"La mètrica Primera renderització significativa mesura el moment en què el contingut principal d'una pàgina està visible. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Primera renderització significativa"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"La mètrica Temps fins que és interactiva marca el moment en què la pàgina és completament interactiva. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Temps fins que és interactiva"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"L'índex de velocitat mostra la rapidesa amb què s'emplena el contingut d'una pàgina. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Índex de velocitat"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"La mètrica Redireccions introdueix retards addicionals abans de poder carregar la pàgina. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Evita les redireccions múltiples a pàgines"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"La mètrica Temps fins al primer byte identifica el moment en què el teu servidor envia una resposta. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"El document arrel ha tardat {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Redueix els temps de resposta del servidor (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Els temps de resposta del servidor són baixos (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Durada"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nom"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Hora d'inici"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tipus"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Et recomanem que utilitzis l'API Temps d'usuari amb la teva aplicació per mesurar-ne el rendiment al món real durant experiències clau dels usuaris. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 temps d'usuari}other{# temps d'usuari}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Marques i mesures de Temps d'usuari"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Et recomanem que afegeixis suggeriments de recursos per connectar-se prèviament o per obtenir el DNS prèviament a fi d'establir connexions anticipades a orígens importants de tercers. [Més informació] (https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Connecta't prèviament als orígens necessaris"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Et recomanem que utilitzis <link rel=preload> per prioritzar l'obtenció de recursos que en aquests moments se sol·liciten en un moment posterior de la càrrega de pàgines. [Més informació] (https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Carrega prèviament les sol·licituds de clau"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Més informació sobre el rendiment de la teva aplicació."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnòstic"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"L'aspecte més crític del rendiment és la velocitat amb què es renderitzen els píxels en pantalla. Mètriques clau: Primera renderització de contigut, Primera renderització significativa"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Millores de la primera renderització"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Aquestes optimitzacions poden accelerar la càrrega de la pàgina."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Oportunitats"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Mètriques"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Millora l'experiència general de càrrega, de manera que la pàgina respongui i estigui preparada per utilitzar-se al més aviat possible. Mètriques clau: Temps fins que és interactiva, Índex de velocitat"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Millores generals"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Rendiment"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL de la memòria cau"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Mida (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Temps invertit"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Possible estalvi (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Possible estalvi (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Possible estalvi de {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Possible estalvi de {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Mostra les auditories"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navegació inicial"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latència de camí crítica màxima:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Error"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Error de l'informe: no hi ha informació d'auditoria"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Dades de laboratori"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Anàlisi amb [Lighthouse] (https://developers.google.com/web/tools/lighthouse/) de la pàgina actual mitjançant una connexió 3G emulada. Els valors són estimacions i poden variar."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Elements addicionals per comprovar manualment"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"No aplicable"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Oportunitat"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Estalvi estimat"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Auditories aprovades"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Escala de puntuació:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Hi ha hagut problemes que afecten aquesta execució de Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Els valors són estimacions i poden variar."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Advertiments: "}};
+
+
+},{}],42:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Rychlost načítání této stránky byla negativně ovlivněna rozšířeními pro Chrome. Zkuste stránku zkontrolovat v anonymním režimu nebo profilu Chromu bez rozšíření."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Vyhodnocování skriptů"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Analýza skriptů"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Celkem"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Pokuste se zkrátit dobu analyzování, kompilování a spouštění JavaScriptu. Mohlo by pomoci odesílat menší soubory JavaScript. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Zkraťte dobu provádění JavaScriptu"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Doba provádění JavaScriptu"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Velké soubory GIF nejsou efektivní k zobrazování animovaného obsahu. Zvažte, zda byste namísto souborů GIF nemohli pro animace použít videa MPEG4/WebM a pro statické obrázky soubory PNG/WebP. Snížíte tak množství přenášených dat. [Další informace](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Pro animovaný obsah používejte formáty videa"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Zvažte možnost načítat obrázky mimo obrazovku a skryté obrázky „líně“ až po načtení všech kritických zdrojů, abyste zkrátili dobu k dosažení interaktivnosti. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Odložte načítání obrázků mimo obrazovku"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"První vykreslení stránky blokují zdroje. Zvažte, zda byste kriticky důležité zdroje JavaScript a CSS nemohli poskytovat přímo v kódu a stahování veškerého nekritického JavaScriptu a stylů odložit. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Eliminujte zdroje, které blokují vykreslení"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Přenášení velkého množství dat po síti je pro uživatele finančně nákladné a obvykle vede k pomalému načítání. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Celková velikost byla {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Předejděte přenášení enormního množství dat"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Nepřenáší enormní množství dat"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Minifikací souborů CSS lze snížit množství přenášených dat. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minifikujte kód CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Minifikací souborů JavaScript lze snížit množství přenášených dat a zrychlit analýzu skriptů. [Další informace](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minifikujte JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Odstraňte z tabulek stylů nepoužívaná pravidla, abyste snížili množství přenášených nepotřebných dat. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Odložte načítání nevyužitých stylů CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Odstraněním nepoužívaného JavaScriptu zmenšíte množství přenášených dat."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Odstraňte nepoužívaný JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Dlouhá platnost mezipaměti může zrychlit opakované návštěvy stránky. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Byl nalezen 1 zdroj}few{Byly nalezeny # zdroje}many{Bylo nalezeno # zdroje}other{Bylo nalezeno # zdrojů}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Statické podklady zobrazujte s efektivními zásadami pro mezipaměť"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Používá u statických podkladů efektivní zásady pro mezipaměť"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimalizované obrázky se načítají rychle a spotřebovávají méně mobilních dat. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Používejte efektivní kódování obrázků"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Zobrazujte obrázky s vhodnou velikostí, abyste ušetřili mobilní data a zrychlili načítání. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Používejte správnou velikost obrázků"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Textové zdroje by se měly odesílat komprimované (gzip, deflate nebo brotli), aby se minimalizovalo množství přenášených dat. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Zapněte kompresi textu"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Formáty obrázků JPEG 2000, JPEG XR a WebP často poskytují lepší kompresi než formáty PNG a JPEG, což znamená rychlejší stahování a menší spotřebu dat. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Zobrazujte obrázky ve formátech nové generace"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Řetězce kritických požadavků níže ukazují, které zdroje se načítají s vysokou prioritou. Zvažte, zda byste načítání stránky nemohli vylepšit tím, že řetězce zkrátíte, zmenšíte zdroje nebo odložíte stahování zdrojů, které nejsou nezbytné. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Byl nalezen 1 řetězec}few{Byly nalezeny # řetězce}many{Bylo nalezeno # řetězce}other{Bylo nalezeno # řetězců}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimalizujte hloubku kritických požadavků"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Vývojáři prohlížečů doporučují, aby stránky obsahovaly méně než cca. 1 500 uzlů modelu DOM. Ideálně by hloubka stromu měla být menší než 32 prvků a každý nadřazený prvek by měl mít méně než 60 podřízených prvků. Velký model DOM může vést k většímu využití paměti, delším [výpočtům stylů](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) a náročným [přeformátováváním rozvržení](https://developers.google.com/speed/articles/reflow). [Další informace](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 uzel}few{# uzly}many{# uzlu}other{# uzlů}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Nepoužívejte příliš velký model DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximální hloubka modelu DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Celkový počet uzlů v modelu DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Nepoužívá příliš velký model DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Pomocí funkce font-display stylů CSS zajistěte, aby byl text při načítání webfontů viditelný uživatelům. [Další informace](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Zajistěte, aby text při načítání webfontů zůstal viditelný"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Při načítání webfontů zůstává veškerý text viditelný"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorie"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Pokuste se zkrátit dobu analyzování, kompilování a spouštění JavaScriptu. Mohlo by pomoci odesílat menší soubory JavaScript."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimalizujte práci v hlavním podprocesu"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimalizuje práci v hlavním podprocesu"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Výše uvedené skóre je odhad (v milisekundách), jak rychle bude aplikace během nejvytíženějších pěti sekund načítání stránky reagovat na vstup uživatele. Pokud je latence větší než 50 ms, mohou uživatelé chování aplikace vnímat jako přerušované. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Odhadovaná latence vstupu"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"První vykreslení obsahu je okamžik vykreslení prvního textu nebo obrázku. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"První vykreslení obsahu"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"První nečinnost procesoru udává čas, kdy je hlavní podproces stránky dostatečně nečinný na to, aby bylo možné zpracovat vstup. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"První nečinnost procesoru"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"První smysluplné vykreslení udává, kdy začne být viditelný primární obsah stránky. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"První smysluplné vykreslení"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interaktivitou se označuje čas, kdy je stránka plně interaktivní. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Doba do interaktivity"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Index rychlosti ukazuje, jak rychle se viditelně vyplní obsah stránky. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Index rychlosti"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Přesměrování způsobují další prodlevy před načtením stránky. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Nepoužívejte několik přesměrování stránky"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Doba do načtení prvního bajtu udává, jak dlouho vašemu serveru trvá, než odešle odpověď. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Hlavní dokument trval {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Zkraťte doby odezvy serverů (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Doby odezvy serveru jsou krátké (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Trvání"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Název"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Čas zahájení"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Typ"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Zkuste v aplikaci pomocí rozhraní User Timing API implementovat měření reálného výkonu při událostech zásadních pro uživatelský dojem. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 časování uživatelů}few{# časování uživatelů}many{# časování uživatelů}other{# časování uživatelů}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Hodnoty časování uživatelů"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Zvažte přidání signálů pro předběžné připojení nebo načtení, aby bylo možné včas se připojit k důležitým zdrojům třetích stran. [Další informace](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"K potřebným zdrojům se připojujte předem"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Zvažte použití značky <link rel=preload> k prioritnímu načtení zdrojů, o které se nyní žádá později během načítání stránky. [Další informace](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Klíčové požadavky načítejte předběžně"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Další informace o výkonu vaší aplikace."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Nejkritičtějším aspektem výkonu je rychlost vykreslení pixelů na obrazovce. Klíčové metriky: První vykreslení obsahu, První smysluplné vykreslení"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Vylepšení prvního vykreslení"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Tyto optimalizace mohou zrychlit načítání vaší stránky."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Příležitosti"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metriky"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Vylepšete celkové chování při načítání, aby byla stránka co nejdříve responzivní a připravena k používání. Klíčové metriky: Doba dosažení interaktivity, Index rychlosti"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Celková vylepšení"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Výkon"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Hodnota TTL (Time to Live) mezipaměti"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Velikost (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Strávený čas"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Možná úspora (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Možná úspora (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Lze uspořit {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Lze uspořit {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Zobrazit audity"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Počáteční navigace"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maximální latence kritické trasy:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Chyba!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Chyba přehledu: žádné informace o auditu"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboratorní data"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Analýza aktuální stránky nástrojem [Lighthouse](https://developers.google.com/web/tools/lighthouse/) při emulovaném připojení 3G. Hodnoty jsou odhady a mohou být proměnlivé."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Další položky k ruční kontrole"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Není relevantní"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Příležitost"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Odhadovaná úspora"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Úspěšné audity"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Škála skóre:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Při tomto spuštění nástroje Lighthouse se vyskytly problémy:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Hodnoty jsou odhady a mohou se lišit."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Upozornění: "}};
+
+
+},{}],43:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome-udvidelser påvirkede denne sides indlæsning negativt. Prøv at revidere siden i inkognitotilstand eller fra en Chrome-profil uden udvidelser."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Scriptevaluering"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Scriptparsing"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"I alt"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Overvej at reducere den tid, der bruges på at parse, kompilere og udføre JavaScript. Levering af mindre JavaScript-datapakker kan hjælpe med dette. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Reducer udførelsestiden for JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Udførelsestid for JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Store giffer er ikke tilstrækkelige til at levere animeret indhold. Overvej at bruge MPEG4-/WebM-videoer til animationer og PNG/WebP til statiske billeder i stedet for giffer for at spare netværksbytes. [Få flere oplysninger](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Brug videoformater til animeret indhold"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Overvej at udskyde indlæsningen af skjulte billeder og billeder, der ikke er på skærmen, til efter alle kritiske ressourcer er blevet indlæst for at reducere den tid, der går, inden siden er interaktiv. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Udskyd billeder, der ikke er på skærmen"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Ressourcer blokerer første udfyldning af din side. Overvej at levere kritisk JavaScript/CSS indlejret og udskyde alle ikke-kritiske JavaScript-elementer/typografier. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Fjern ressourcer til blokering af gengivelse"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Store datapakker på netværk koster brugerne mange penge og er forbundet med lang indlæsningstid. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Den samlede størrelse var {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Undgå kæmpe datapakker på netværk"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Undgår kæmpe datapakker på netværk"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Formindskelse af CSS-filer kan reducere størrelsen på datapakker på netværk. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Formindsk CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Formindskelse af JavaScript-filer kan reducere størrelsen på datapakker og varigheden af scriptparsing. [Få flere oplysninger](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Formindsk JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Fjern regler, som ikke bruges, fra typografiark for at skære ned på antallet af unødvendige bytes, der anvendes ved netværksaktivitet. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Udskyd CSS, som ikke bruges"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Fjern JavaScript, der ikke bruges, for at skære ned på antallet af bytes, der anvendes ved netværksaktivitet."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Fjern JavaScript, som ikke bruges"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"En lang cachelevetid kan gøre indlæsningen hurtigere for tilbagevendende besøgende på din side. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Der blev fundet 1 ressource}one{Der blev fundet # ressource}other{Der blev fundet # ressourcer}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Vis statiske aktiver med en effektiv cachepolitik"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Anvender effektiv cachepolitik på statiske aktiver"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimerede billeder indlæses hurtigere og bruger mindre mobildata. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Kryptér billeder effektivt"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Vis billeder i korrekte størrelser for at spare mobildata og forbedre indlæsningstiden. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Brug korrekte billedstørrelser"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Tekstbaserede ressourcer bør vises i komprimeret format (gzip, Deflate eller Brotli), så netværkets samlede antal bytes formindskes. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Aktivér tekstkomprimering"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Billedformater såsom JPEG 2000, JPEG XR og WebP giver ofte en bedre komprimering end PNG og JPEG, hvilket betyder hurtigere downloads og mindre dataforbrug. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Vis billeder i formater af næste generation"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Kæderne med kritiske anmodninger nedenfor viser dig, hvilke ressourcer der indlæses med høj prioritet. Du kan også vælge at reducere kædernes længde, så ressourcernes downloadstørrelse bliver mindre, eller at udskyde download af unødvendige ressourcer, så sideindlæsningen forbedres. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Der blev fundet 1 kæde}one{Der blev fundet # kæde}other{Der blev fundet # kæder}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimer dybden for kritiske anmodninger"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Browserudviklere anbefaler, at sider højst indeholder 1.500 DOM-noder. Det bedste er en træstrukturdybde med under 32 elementer og mindre end 60 underordnede/overordnede elementer. En stor DOM kan øge hukommelsesforbruget, medføre længere [beregninger af typografi](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) og producere dyre [omformateringer af layout](https://developers.google.com/speed/articles/reflow). [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 node}one{# node}other{# noder}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Undgå en overdreven DOM-størrelse"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksimal DOM-dybde"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Samlet antal DOM-noder"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Undgår en overdreven DOM-størrelse"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Udnyt CSS-funktionen til skrifttypevisning for at sikre dig, at teksten kan ses af brugerne, mens webfonts indlæses. [Få flere oplysninger](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Sørg for, at tekst forbliver synlig under indlæsning af webfont"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Al tekst forbliver synlig under indlæsning af webfont"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategori"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Overvej at reducere den tid, der bruges på at parse, kompilere og udføre JavaScript. Levering af mindre JavaScript-datapakker kan hjælpe med dette."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Formindsk primært trådarbejde"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Formindsker primært trådarbejde"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Resultatet ovenfor er et estimat af, hvor længe din app er om at svare på brugerinput (i millisekunder) i de første 5 travleste sekunder med vindue under en sideindlæsning. Hvis din forsinkelse er større end 50 ms, kan brugerne opfatte din app som langsom. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Estimeret inputforsinkelse"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Første udfyldning af indhold markerer tidspunktet, hvor den første tekst eller det første billede udfyldes. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Første udfyldning af indhold"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Første stillestående CPU markerer det tidspunkt, hvor sidens primære tråd er stabil nok til at behandle input. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Første stillestående CPU"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Første betydningsfulde udfyldning måler, hvornår det primære indhold på en side kan ses. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Første betydningsfulde udfyldning"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interaktiv tilstand markerer det tidspunkt, hvor siden er helt interaktiv. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tid inden interaktiv tilstand"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Hastighedsindekset viser, hvor hurtigt indholdet på en side udfyldes, så det kan ses. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Hastighedsindeks"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Omdirigeringer medfører yderligere forsinkelser, inden siden kan indlæses. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Undgå mange sideomdirigeringer"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"TTFB (Time To First Byte) identificerer tidspunktet for, hvornår din server sender et svar. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Roddokumentet tog {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Reducer serversvartider (TTFB, Time To First Byte)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Serversvartiderne er korte (TTFB, Time To First Byte)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Varighed"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Navn"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Starttidspunkt"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Type"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Du kan også vælge at bruge User Timing API som værktøj til din app for at måle appens effektivitet i den virkelige verden i forbindelse med vigtige brugeroplevelser. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 brugstid}one{# brugstid}other{# brugstider}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Brugstider markerer og måler"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Overvej at tilføje ressourcehints til forbindelse på forhånd eller DNS-forudhentning for at oprette tidlige forbindelser til vigtige tredjepartswebsites. [Få flere oplysninger](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Opret forbindelse på forhånd til påkrævede websites"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Overvej at bruge <link rel=preload> til at prioritere hentning af ressourcer, som der i øjeblikket anmodes om senere i sideindlæsningen. [Få flere oplysninger](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Forudindlæs vigtige anmodninger"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Få flere oplysninger om din apps effektivitet."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostik"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Det vigtigste aspekt af effektivitet er, hvor hurtigt pixels gengives på skærmen. Vigtige metrics: Første udfyldning af indhold, Første betydningsfulde udfyldning"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Forbedringer af første udfyldning"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Disse optimeringer kan gøre din sideindlæsning hurtigere."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Muligheder"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metrics"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Gør den overordnede indlæsning bedre, så siden hurtigst muligt bliver responsiv og klar til brug. Vigtige metrics: Tid inden interaktiv tilstand, Hastighedsindeks"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Overordnede forbedringer"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Effektivitet"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Cache-TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Størrelse (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Tidsforbrug"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"Webadresse"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potentiel databesparelse (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potentiel tidsbesparelse (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potentiel databesparelse på {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potentiel tidsbesparelse på {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} sek."},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Se revisioner"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Indledende navigation"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maksimal forsinkelse for kritisk sti:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Der opstod en fejl"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Rapportfejl: Der er ingen revisionsoplysninger"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboratoriedata"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/)-analyse af den aktuelle side på et emuleret 3G-netværk. Værdierne er estimerede og kan variere."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Yderligere elementer, der skal tjekkes manuelt"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Ikke relevant"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Mulighed"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Estimeret tidsbesparelse"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Beståede revisioner"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Resultatskala:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Der blev registreret problemer, som påvirkede denne kørsel af Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Værdierne er estimater og kan variere."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Advarsler! "}};
+
+
+},{}],44:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome-Erweiterungen haben die Ladegeschwindigkeit dieser Seite beeinträchtigt. Versuchen Sie, die Seite im Inkognito-Modus oder mit einem Chrome-Profil ohne Erweiterungen zu überprüfen."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Skriptauswertung"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Parsen von Skripten"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Gesamt"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Versuchen Sie, die Zeit für das Parsen, Kompilieren und Ausführen von JS zu reduzieren. Die Bereitstellung kleinerer JS-Nutzlasten kann dabei helfen. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Ausführungszeit von JavaScript reduzieren"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript-Ausführungszeit"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Große GIF-Dateien sind nur bedingt für die Bereitstellung animierter Inhalte geeignet. Sie können statt GIF MPEG4- oder WebM-Videos für Animationen und PNG oder WebP für statische Bilder verwenden und so die Netzwerk-Datenmenge reduzieren. [Weitere Informationen](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Videoformate für animierte Inhalte verwenden"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Versuchen Sie, nicht sichtbare und versteckte Bilder erst laden zu lassen, nachdem wichtige Ressourcen geladen wurden, um die Zeit bis zur Interaktivität zu reduzieren. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Nicht sichtbare Bilder aufschieben"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Ressourcen blockieren das erste Zeichnen Ihrer Seite. Versuchen Sie, wichtiges JS und wichtige CSS inline bereitzustellen und alle nicht kritischen JS und Stile aufzuschieben. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Ressourcen beseitigen, die das Rendering blockieren"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Große Netzwerknutzlasten kosten Nutzer bares Geld und hängen eng mit langen Ladezeiten zusammen. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Die Gesamtgröße war {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Sehr große Netzwerknutzlasten vermeiden"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Vermeidet sehr große Netzwerknutzlasten"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Durch die Komprimierung von CSS-Dateien kann die Größe von Netzwerknutzlasten reduziert werden. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"CSS komprimieren"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Durch die Komprimierung von JavaScript-Dateien können Nutzlastgrößen und die Zeit zum Parsen von Skripts reduziert werden. [Weitere Informationen](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"JavaScript komprimieren"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Entfernen Sie nicht verwendete Regeln aus Stylesheets, um unnötige Daten bei Netzwerkaktivitäten zu reduzieren. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Nicht verwendete CSS aufschieben"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Entfernen Sie nicht verwendetes JavaScript, um die Datenmenge bei Netzwerkaktivitäten zu reduzieren."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Nicht genutztes JavaScript entfernen"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Eine lange Lebensdauer des Cache kann wiederholte Besuche Ihrer Seite beschleunigen. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 Ressource gefunden}other{# Ressourcen gefunden}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Statische Inhalte mit einer effizienten Cache-Richtlinie bereitstellen"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Verwendet eine effiziente Cache-Richtlinie für statische Inhalte"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimierte Bilder werden schneller geladen und verbrauchen weniger mobile Daten. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Bilder effizient codieren"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Stellen Sie Bilder bereit, die eine angemessene Größe haben, um mobile Daten zu sparen und die Ladezeit zu verbessern. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Bilder richtig dimensionieren"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Textbasierte Ressourcen sollten mit Komprimierung (gzip, Deflate oder Brotli) bereitgestellt werden, um die Datenmenge im Netzwerk insgesamt zu minimieren. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/text-compression)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Textkomprimierung aktivieren"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Bildformate wie JPEG 2000, JPEG XR und WebP bieten oft eine bessere Komprimierung als PNG oder JPEG, was schnellere Downloads und einen geringeren Datenverbrauch ermöglicht. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Bilder in modernen Formaten bereitstellen"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"In den unten aufgeführten Ketten kritischer Anfragen können Sie sehen, welche Ressourcen mit einer hohen Priorität geladen werden. Versuchen Sie, die Ketten zu verkürzen, die Downloadgröße von Ressourcen zu reduzieren oder das Herunterladen unnötiger Ressourcen aufzuschieben, um den Seitenaufbau zu beschleunigen. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 Kette gefunden}other{# Ketten gefunden}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Tiefe kritischer Anforderungen minimieren"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Laut der Empfehlung von Browserentwicklern sollten Seiten nicht mehr als ungefähr 1.500 DOM-Knoten enthalten. Die ideale Strukturtiefe liegt bei unter 32 Elementen und weniger als 60 unter- und übergeordneten Elementen. Ein großes DOM kann zu hohem Speicherverbrauch, langwierigen [Stilberechnungen](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) und kostspieligen [dynamischen Umbrüchen im Layout](https://developers.google.com/speed/articles/reflow) führen. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 Knoten}other{# Knoten}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Übermäßige DOM-Größe vermeiden"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximale DOM-Tiefe"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Gesamtzahl der DOM-Knoten"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Vermeidet eine übermäßige DOM-Größe"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Sie können Gebrauch von der CSS-Funktion \"font-display\" machen, um sicherzugehen, dass der Text für Nutzer sichtbar ist, während Webfonts geladen werden. [Weitere Informationen](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Darauf achten, dass der Text während der Webfont-Ladevorgänge sichtbar bleibt"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Der gesamte Text bleibt während der Webfont-Ladevorgänge sichtbar"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorie"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Versuchen Sie, die Zeit für das Parsen, Kompilieren und Ausführen von JS zu reduzieren. Die Bereitstellung kleinerer JS-Nutzlasten kann dabei helfen."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Aufwand für Hauptthread minimieren"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimiert den Aufwand für den Hauptthread"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Beim Ergebnis oben handelt es sich um eine Schätzung dessen, wie viele Millisekunden Ihre App benötigt, um während des 5-s-Fensters mit der stärksten Auslastung beim Seitenaufbau auf Nutzereingaben zu reagieren. Wenn die Latenz bei Ihnen über 50 ms liegt, empfinden Nutzer Ihre App möglicherweise als langsam. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Geschätzte Eingabelatenz"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"\"Erste Inhalte gezeichnet\" gibt an, wann der erste Text oder das erste Bild gezeichnet wird. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Erste Inhalte gezeichnet"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"\"Erster CPU-Leerlauf\" gibt den Zeitpunkt an, an dem die Aktivität des Hauptthreads der Seite das erste Mal gering genug ist, um Eingaben zu verarbeiten. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Erster CPU-Leerlauf"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"\"Inhalte weitgehend gezeichnet\" gibt an, wann die Hauptinhalte einer Seite sichtbar sind. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Inhalte weitgehend gezeichnet"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"\"Zeit bis Interaktivität\" gibt den Zeitpunkt an, an dem die Seite voll interaktionsfähig ist. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Zeit bis Interaktivität"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Der Geschwindigkeitsindex zeigt an, wie schnell die Inhalte einer Seite sichtbar dargestellt werden. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Geschwindigkeitsindex"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Weiterleitungen führen zu zusätzlichen Verzögerungen, bevor die Seite geladen werden kann. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Mehrere Weiterleitungen auf die Seite vermeiden"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"TTFB (Time To First Byte) erkennt den Zeitpunkt, an dem Ihr Server eine Antwort sendet. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Stammdokument brauchte {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Serverantwortzeiten reduzieren (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Serverantwortzeiten sind niedrig (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Dauer"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Name"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Beginn"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Typ"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Sie können die User Timing API in Ihre App integrieren. Damit lässt sich die Leistung Ihrer App in der Praxis messen, beispielsweise während Seitenladevorgängen oder wichtigen Nutzerinteraktionen. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 Nutzertiming}other{# Nutzertimings}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Markierungen und Messungen für das Nutzertiming"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Versuchen Sie, Hinweise auf Ressourcen für eine Vorverbindung oder einen DNS-Vorabruf hinzuzufügen, damit möglichst frühzeitig eine Verbindung zu wichtigen Drittanbieterursprüngen hergestellt wird. [Weitere Informationen](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Vorverbindung zu erforderlichen Ursprüngen aufbauen"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Mit <link rel=preload> können Sie das Abrufen von Ressourcen priorisieren, die aktuell später beim Seitenaufbau angefordert werden. [Weitere Informationen](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Wichtige Anforderungen vorab laden"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Weitere Informationen zur Leistung Ihrer App."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnose"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Der wichtigste Faktor bei der Leistung ist, wie schnell Pixel auf dem Bildschirm gerendert werden. Wichtige Messwerte: \"Erste Inhalte gezeichnet\", \"Inhalte weitgehend gezeichnet\""},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Verbesserungen beim Zeichnen der ersten Inhalte"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Diese Optimierungen können den Seitenaufbau beschleunigen."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Empfehlungen"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Messwerte"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Hier können Sie die Ladezeiten verkürzen, damit die Seite so schnell wie möglich reagiert und Einsatzbereit ist. Wichtige Messwerte: \"Zeit bis Interaktivität\", \"Geschwindigkeitsindex\""},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Allgemeine Verbesserungen"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Leistung"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Cache-TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Größe (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Zeitaufwand"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Mögliche Einsparung (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Mögliche Einsparung (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Mögliche Einsparung von {wastedBytes, number, bytes} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Mögliche Einsparung von {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Überprüfungen ansehen"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Anfangsnavigation"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maximale Latenz für kritischen Pfad:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Fehler."},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Fehler gemeldet: keine Informationen zur Überprüfung"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Labdaten"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/)-Analyse der aktuellen Seite in einem emulierten 3G-Netz. Die Werte sind geschätzt und können variieren."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Zusätzliche Elemente zur manuellen Überprüfung"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nicht zutreffend"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Empfehlung"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Geschätzte Einsparung"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Bestandene Prüfungen"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Ergebnisskala:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Einige Probleme haben diese Ausführung von Lighthouse beeinträchtigt:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Die Werte sind geschätzt und können variieren."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Warnungen: "}};
+
+
+},{}],45:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Οι επεκτάσεις του Chrome επηρέασαν αρνητικά την απόδοση φόρτωσης αυτής της σελίδας. Δοκιμάστε να ελέγξετε τη σελίδα σε κατάσταση ανώνυμης περιήγησης ή από ένα προφίλ του Chrome χωρίς επεκτάσεις."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Αξιολόγηση σεναρίου"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Ανάλυση σεναρίου"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Σύνολο"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Εξετάστε το ενδεχόμενο μείωσης του χρόνου ανάλυσης, σύνθεσης και εκτέλεσης JS. Μπορεί να διαπιστώσετε ότι η προβολή μικρότερων φορτίων δεδομένων JS συμβάλλει προς αυτήν την κατεύθυνση. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Μείωση χρόνου εκτέλεσης JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Χρόνος εκτέλεσης JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Οι μεγάλες εικόνες GIF δεν είναι αποδοτικές για την προβολή περιεχομένου κινούμενων εικόνων. Εξετάστε το ενδεχόμενο χρήσης βίντεο MPEG4/WebM για κινούμενες εικόνες και PNG/WebP για στατικές εικόνες αντί για τη χρήση εικόνων GIF, με στόχο την εξοικονόμηση byte δικτύου. [Μάθετε περισσότερα](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Χρήση μορφών βίντεο για περιεχόμενο κινούμενων εικόνων"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Εξετάστε τη φόρτωση εικόνων εκτός οθόνης και κρυφών εικόνων με καθυστέρηση μετά την ολοκλήρωση της φόρτωσης όλων των σημαντικών πόρων, προκειμένου να ελαττωθεί ο χρόνος μετάβασης σε κατάσταση αλληλεπίδρασης. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Καθυστέρηση φόρτωσης εικόνων εκτός οθόνης"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Υπάρχουν πόροι οι οποίοι αποκλείουν την πρώτη μορφή της σελίδας σας. Εξετάστε το ενδεχόμενο προβολής σημαντικών ενσωματωμένων JS/CSS και καθυστέρησης όλων των μη σημαντικών JS/στυλ. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Εξάλειψη πόρων που αποκλείουν την απόδοση"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Τα μεγάλα φορτία δεδομένων δικτύου συνεπάγονται υψηλό χρηματικό κόστος για τους χρήστες και συσχετίζονται σε μεγάλο βαθμό με εκτενείς χρόνους φόρτωσης. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Το συνολικό μέγεθος ήταν {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Αποφύγετε τα πολύ μεγάλα φορτία δεδομένων δικτύου"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Αποφεύγει τα πολύ μεγάλα φορτία δεδομένων δικτύου"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Με την ελαχιστοποίηση των αρχείων CSS, μπορεί να ελαττωθούν τα μεγέθη φορτίου δεδομένων δικτύου. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Ελαχιστοποίηση CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Με την ελαχιστοποίηση των αρχείων JavaScript, μπορεί να μειωθούν τα μεγέθη φορτίου δεδομένων και να ελαττωθεί ο χρόνος ανάλυσης σεναρίου. [Μάθετε περισσότερα](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Ελαχιστοποίηση JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Καταργήστε κανόνες που δεν χρησιμοποιούνται από τα φύλλα στυλ, για να μειώσετε τον αριθμό των μη απαραίτητων byte που καταναλώνονται από τη δραστηριότητα δικτύου. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Καθυστέρηση μη χρησιμοποιούμενων CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Καταργήστε τυχόν JavaScript που δεν χρησιμοποιείται, για να ελαττώσετε τα byte που καταναλώνονται από τη δραστηριότητα δικτύου."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Κατάργηση JavaScript που δεν χρησιμοποιείται"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Η μεγάλη διάρκεια ζωής της κρυφής μνήμης μπορεί να επιταχύνει τις επαναλαμβανόμενες επισκέψεις στη σελίδα σας. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Βρέθηκε 1 πόρος}other{Βρέθηκαν # πόροι}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Προβολή στατικών στοιχείων με επαρκή πολιτική κρυφής μνήμης"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Χρησιμοποιεί αποδοτική πολιτική κρυφής μνήμης σε στατικά στοιχεία"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Οι βελτιστοποιημένες εικόνες φορτώνονται πιο γρήγορα και καταναλώνουν λιγότερα δεδομένα κινητής τηλεφωνίας. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Αποδοτική κωδικοποίηση εικόνων"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Προβάλετε εικόνες κατάλληλου μεγέθους, για την εξοικονόμηση δεδομένων κινητής τηλεφωνίας και τη βελτίωση του χρόνου φόρτωσης. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Κατάλληλη προσαρμογή μεγέθους εικόνων"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Οι πόροι που βασίζονται σε κείμενο θα πρέπει να προβάλλονται με συμπίεση (gzip, deflate ή brotli), προκειμένου να ελαχιστοποιούνται τα byte δικτύου. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Ενεργοποίηση συμπίεσης κειμένου"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Οι μορφές εικόνας όπως JPEG 2000, JPEG XR και WebP συχνά παρέχουν καλύτερη συμπίεση από ό,τι οι μορφές PNG και JPEG. Αυτό σημαίνει γρηγορότερες λήψεις και μικρότερη κατανάλωση δεδομένων. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Προβολή εικόνων σε μορφές επόμενης γενιάς"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Οι Αλυσίδες κρίσιμων αιτημάτων που ακολουθούν δείχνουν τους πόρους που φορτώνονται με υψηλή προτεραιότητα. Εξετάστε το ενδεχόμενο μείωσης του μεγέθους των αλυσίδων, μείωσης του μεγέθους λήψης πόρων ή καθυστέρησης της λήψης μη απαραίτητων πόρων, για τη βελτίωση της φόρτωσης σελίδας. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Βρέθηκε 1 αλυσίδα}other{Βρέθηκαν # αλυσίδες}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Ελαχιστοποίηση βάθους κρίσιμων αιτημάτων"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Οι μηχανικοί προγραμμάτων περιήγησης συνιστούν να περιέχουν οι σελίδες λιγότερους από ~1.500 κόμβους DOM. Το ιδανικό είναι ένα βάθος δέντρου με < 32 στοιχεία και λιγότερα από 60 θυγατρικά/γονικά στοιχεία. Ένα μεγάλο DOM μπορεί να αυξήσει τη χρήση της μνήμης, να προκαλέσει [υπολογισμούς στυλ] μεγαλύτερης διάρκειας (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) και να δημιουργήσει [επαναληπτικές ροές διάταξης] υψηλού κόστους (https://developers.google.com/speed/articles/reflow). [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 κόμβος}other{# κόμβοι}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Αποφύγετε τα υπερβολικά μεγάλα μεγέθη DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Μέγιστο βάθος DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Σύνολο κόμβων DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Αποφεύγει τα υπερβολικά μεγάλα μεγέθη DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Χρησιμοποιήστε τη λειτουργία CSS προβολής γραμματοσειράς, για να διασφαλίσετε ότι το κείμενο είναι ορατό στους χρήστες κατά τη φόρτωση των γραμματοσειρών ιστοτόπου. [Μάθετε περισσότερα](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Βεβαιωθείτε ότι το κείμενο παραμένει ορατό κατά τη διάρκεια της φόρτωσης γραμματοσειράς ιστοτόπου"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Όλο το κείμενο παραμένει ορατό κατά τη διάρκεια φορτώσεων γραμματοσειράς ιστοτόπου"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Κατηγορία"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Εξετάστε το ενδεχόμενο ελάττωσης του χρόνου ανάλυσης, σύνθεσης και εκτέλεσης JS. Μπορεί να διαπιστώσετε ότι η προβολή μικρότερων φορτίων δεδομένων JS συμβάλλει προς αυτήν την κατεύθυνση."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Ελαχιστοποίηση εργασίας κύριου νήματος"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Ελαχιστοποιεί την εργασία κύριου νήματος"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Η παραπάνω βαθμολογία αποτελεί εκτίμηση του χρόνου που απαιτείται προκειμένου η εφαρμογή σας να ανταποκριθεί στα στοιχεία εισόδου χρήστη, σε χιλιοστά του δευτερολέπτου, κατά τη διάρκεια εκτέλεσης του παραθύρου φόρτωσης σελίδας 5 δευτ. με τη μεγαλύτερη κινητικότητα. Εάν ο λανθάνων χρόνος είναι μεγαλύτερος από 50 ms, οι χρήστες μπορεί να θεωρήσουν ότι η εφαρμογή σας είναι αργή. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Εκτιμώμενος λανθάνων χρόνος στοιχείων εισόδου"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Η Πρώτη σχεδίαση περιεχομένου (FCP) υποδεικνύει πότε μορφοποιείται το πρώτο κείμενο ή η πρώτη εικόνα. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Πρώτη μορφή με περιεχόμενο"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Η Πρώτη αδράνεια CPU υποδεικνύει την πρώτη φορά που το κύριο νήμα μιας σελίδας παρουσιάζει αρκετά χαμηλή κινητικότητα έτσι ώστε να διαχειριστεί στοιχεία εισόδου. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Πρώτη αδράνεια CPU"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Η Πρώτη χρήσιμη μορφή υπολογίζει πότε είναι ορατό το κύριο περιεχόμενο μιας σελίδας. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Πρώτη χρήσιμη μορφή"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Η Αλληλεπίδραση υποδεικνύει πότε η σελίδα είναι πλήρως διαδραστική. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Χρόνος για Αλληλεπίδραση"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Το Ευρετήριο ταχύτητας δείχνει πόσο γρήγορα γίνονται ορατά τα περιεχόμενα μιας σελίδας. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Ευρετήριο ταχύτητας"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Οι ανακατευθύνσεις δημιουργούν επιπλέον καθυστερήσεις προτού να είναι δυνατή η φόρτωση της σελίδας. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Αποφυγή ανακατευθύνσεων πολλών σελίδων"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Ο Χρόνος μέχρι το πρώτο byte προσδιορίζει πότε ο διακομιστής σας στέλνει μια απόκριση. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Το αρχείο ρίζας χρειάστηκε {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Μείωση χρόνων απόκρισης διακομιστή (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Οι χρόνοι απόκρισης διακομιστή είναι χαμηλοί (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Διάρκεια"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Όνομα"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Ώρα έναρξης"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Τύπος"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Εξετάστε το ενδεχόμενο ενίσχυσης της εφαρμογής σας με το User Timing API, για να καταμετράτε την πραγματική απόδοση της εφαρμογής σας κατά τη διάρκεια σημαντικών εμπειριών χρήστη. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 χρόνος χρήστη}other{# χρόνοι χρήστη}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Ενδείξεις και μετρήσεις Χρόνων χρήστη"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Εξετάστε το ενδεχόμενο προσθήκης υποδείξεων πόρου προσύνδεσης ή προανάλυσης dns, για τη δημιουργία πρώιμων συνδέσεων σε σημαντικές προελεύσεις τρίτου μέρους. [Μάθετε περισσότερα](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Προσύνδεση σε απαιτούμενες προελεύσεις"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Εξετάστε το ενδεχόμενο χρήσης <link rel=φορτίου δεδομένων>, για να δώσετε προτεραιότητα στην ανάλυση πόρων των οποίων το αίτημα εμφανίζεται αργότερα στη σελίδα. [Μάθετε περισσότερα](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Σημαντικά αιτήματα προφόρτωσης"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Περισσότερες πληροφορίες σχετικά με την απόδοση της εφαρμογής σας"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Διαγνωστικά στοιχεία"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Η πιο σημαντική πτυχή της απόδοσης είναι η ταχύτητα με την οποία αποδίδονται τα pixel στην οθόνη. Σημαντικές μετρήσεις: Πρώτη μορφή με περιεχόμενο, Πρώτη χρήσιμη μορφή"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Βελτιώσεις πρώτης μορφής"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Αυτοί οι οργανισμοί μπορούν να επιταχύνουν τη φόρτωση της σελίδας σας."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Ευκαιρίες"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Μετρήσεις"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Βελτιώστε τη συνολική εμπειρία φόρτωσης, για να μπορεί η σελίδα να ανταποκρίνεται και να είναι έτοιμη για χρήση το συντομότερο δυνατό. Σημαντικές μετρήσεις: Χρόνος για Αλληλεπίδραση, Ευρετήριο ταχύτητας"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Συνολικές βελτιώσεις"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Απόδοση"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL κρυφής μνήμης"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Μέγεθος (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Χρόνος χρήσης"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Δυνητικές εξοικονομήσεις (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Δυνητικές εξοικονομήσεις (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Δυνητικές εξοικονομήσεις {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Δυνητικές εξοικονομήσεις {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} δ."},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Εμφάνιση ελέγχων"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Αρχική πλοήγηση"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Μέγιστος λανθάνων χρόνος κρίσιμης διαδρομής:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Σφάλμα!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Σφάλμα αναφοράς: Δεν υπάρχουν πληροφορίες ελέγχου"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Εργαστηριακά δεδομένα"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Φάρος](https://developers.google.com/web/tools/lighthouse/) ανάλυση της τρέχουσας σελίδας σε προσομοιωμένο 3G. Οι τιμές αποτελούν εκτιμήσεις και μπορεί να ποικίλουν."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Επιπλέον στοιχεία για μη αυτόματο έλεγχο"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Δεν ισχύει"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Ευκαιρία"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Εκτιμώμενες εξοικονομήσεις"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Έλεγχοι που ολοκληρώθηκαν επιτυχώς"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Κλίμακα βαθμολογίας:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Παρουσιάστηκαν ορισμένα ζητήματα τα οποία επηρεάζουν αυτήν την εκτέλεση του Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Οι τιμές εκτιμώνται και μπορεί να ποικίλουν."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Προειδοποιήσεις: "}};
+
+
+},{}],46:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome extensions negatively affected this page's load performance. Try auditing the page in incognito mode or from a Chrome profile without extensions."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Script Evaluation"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Script Parse"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Consider reducing the time spent parsing, compiling and executing JS. You may find delivering smaller JS payloads helps with this. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Reduce JavaScript execution time"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript execution time"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Large GIFs are inefficient for delivering animated content. Consider using MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save network bytes. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Use video formats for animated content"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Consider lazy-loading off-screen and hidden images after all critical resources have finished loading to lower time to interactive. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Defer off-screen images"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resources are blocking the first paint of your page. Consider delivering critical JS/CSS inline and deferring all non-critical JS/styles. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Eliminate render-blocking resources"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Large network payloads cost users real money and are highly correlated with long load times. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Total size was {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Avoid enormous network payloads"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Avoids enormous network payloads"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Minifying CSS files can reduce network payload sizes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minify CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Minifying JavaScript files can reduce payload sizes and script parse time. [Learn more](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minify JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Remove unused rules from stylesheets to reduce unnecessary bytes consumed by network activity. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Defer unused CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Remove unused JavaScript to reduce bytes consumed by network activity."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Remove unused JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"A long cache lifetime can speed up repeat visits to your page. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 resource found}other{# resources found}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Serve static assets with an efficient cache policy"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Uses efficient cache policy on static assets"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimised images load faster and consume less mobile data. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Efficiently encode images"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Serve images that are appropriately-sized to save mobile data and improve load time. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Properly size images"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Text-based resources should be served with compression (gzip, deflate or brotli) to minimise total network bytes. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Enable text compression"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Image formats like JPEG 2000, JPEG XR and WebP often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Serve images in next-gen formats"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"The Critical Request Chains below show you what resources are loaded with a high priority. Consider reducing the length of chains, reducing the download size of resources or deferring the download of unnecessary resources to improve page load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 chain found}other{# chains found}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimise Critical Requests Depth"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Browser engineers recommend pages contain fewer than ~1,500 DOM nodes. The sweet spot is a tree depth < 32 elements and fewer than 60 children/parent element. A large DOM can increase memory usage, cause longer [style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 node}other{# nodes}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Avoid an excessive DOM size"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximum DOM Depth"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Total DOM Nodes"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Avoids an excessive DOM size"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Leverage the font-display CSS feature to ensure text is user-visible while webfonts are loading. [Learn more](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Ensure text remains visible during webfont load"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"All text remains visible during webfont loads"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Category"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Consider reducing the time spent parsing, compiling and executing JS. You may find delivering smaller JS payloads helps with this."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimise main-thread work"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimises main-thread work"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"The score above is an estimate of how long your app takes to respond to user input, in milliseconds, during the busiest 5-second window of page load. If your latency is higher than 50 ms, users may perceive your app as laggy. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Estimated Input Latency"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"First Contentful Paint marks the time at which the first text or image is painted. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"First Contentful Paint"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"First CPU Idle marks the first time at which the page's main thread is quiet enough to handle input. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"First CPU Idle"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"First Meaningful Paint measures when the primary content of a page is visible. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"First Meaningful Paint"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interactive marks the time at which the page is fully interactive. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Time to Interactive"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Speed Index shows how quickly the contents of a page are visibly populated. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Speed Index"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Redirects introduce additional delays before the page can be loaded. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Avoid multiple page redirects"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Time To First Byte identifies the time at which your server sends a response. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Root document took {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Reduce server response times (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Server response times are low (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Duration"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Name"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Start Time"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Type"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Consider instrumenting your app with the User Timing API to measure your app's real-world performance during key user experiences. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 user timing}other{# user timings}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"User Timing marks and measures"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Consider adding pre-connect or DNS-prefetch resource hints to establish early connections to important third-party origins. [Learn more](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Pre-connect to required origins"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Consider using <link rel=preload> to prioritise fetching resources that are currently requested later in page load. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Pre-load key requests"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"More information about the performance of your application."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostics"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"The most critical aspect of performance is how quickly pixels are rendered onscreen. Key metrics: First Contentful Paint, First Meaningful Paint"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"First Paint Improvements"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"These optimisations can speed up your page load."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Opportunities"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metrics"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Enhance the overall loading experience, so the page is responsive and ready to use as soon as possible. Key metrics: Time to Interactive, Speed Index"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Overall Improvements"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Performance"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Cache TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Size (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Time Spent"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potential Savings (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potential Savings (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potential savings of {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potential savings of {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Show audits"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Initial Navigation"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maximum critical path latency:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Error!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Report error: no audit information"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Lab Data"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on emulated 3G. Values are estimated and may vary."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Additional items to manually check"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Not applicable"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Opportunity"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Estimated Savings"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Passed audits"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Score scale:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"There were issues affecting this run of Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Values are estimated and may vary."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Warnings: "}};
+
+
+},{}],47:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"[Çĥŕömé éxţéñšîöñš ñéĝåţîvéļý 僃éçţéð ţĥîš þåĝé'š ļöåð þéŕƒöŕmåñçé. Ţŕý åûðîţîñĝ ţĥé þåĝé îñ îñçöĝñîţö möðé öŕ ƒŕöm å Çĥŕömé þŕöƒîļé ŵîţĥöûţ éxţéñšîöñš. one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo]"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"[Šçŕîþţ Évåļûåţîöñ one two three]"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"[Šçŕîþţ Þåŕšé one two]"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"[Ţöţåļ one]"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"[Çöñšîðéŕ ŕéðûçîñĝ ţĥé ţîmé šþéñţ þåŕšîñĝ, çömþîļîñĝ, åñð éxéçûţîñĝ ĴŠ. Ýöû måý ƒîñð ðéļîvéŕîñĝ šmåļļéŕ ĴŠ þåýļöåðš ĥéļþš ŵîţĥ ţĥîš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/бööţûþ). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight]"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"[Ŕéðûçé ĴåvåŠçŕîþţ éxéçûţîöñ ţîmé one two three four five six seven]"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"[ĴåvåŠçŕîþţ éxéçûţîöñ ţîmé one two three]"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"[Ļåŕĝé ĜÎFš åŕé îñ郃îçîéñţ ƒöŕ ðéļîvéŕîñĝ åñîmåţéð çöñţéñţ. Çöñšîðéŕ ûšîñĝ MÞÉĜ4/ŴéбM vîðéöš ƒöŕ åñîmåţîöñš åñð ÞÑĜ/ŴéбÞ ƒöŕ šţåţîç îmåĝéš îñšţéåð öƒ ĜÎF ţö šåvé ñéţŵöŕķ бýţéš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ƒûñðåméñţåļš/þéŕƒöŕmåñçé/öþţîmîžîñĝ-çöñţéñţ-郃îçîéñçý/ŕéþļåçé-åñîmåţéð-ĝ-ŵîţĥ-vîðéö/) one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine thirty thirtyone thirtytwo thirtythree thirtyfour thirtyfive thirtysix thirtyseven]"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"[Ûšé vîðéö ƒöŕmåţš ƒöŕ åñîmåţéð çöñţéñţ one two three four five six seven eight]"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"[Çöñšîðéŕ ļåžý-ļöåðîñĝ öƒƒšçŕééñ åñð ĥîððéñ îmåĝéš åƒţéŕ åļļ çŕîţîçåļ ŕéšöûŕçéš ĥåvé ƒîñîšĥéð ļöåðîñĝ ţö ļöŵéŕ ţîmé ţö îñţéŕåçţîvé. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/öƒƒšçŕééñ-îmåĝéš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight]"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"[Ðéƒéŕ öƒƒšçŕééñ îmåĝéš one two three]"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"[Ŕéšöûŕçéš åŕé бļöçķîñĝ ţĥé ƒîŕšţ þåîñţ öƒ ýöûŕ þåĝé. Çöñšîðéŕ ðéļîvéŕîñĝ çŕîţîçåļ ĴŠ/ÇŠŠ îñļîñé åñð ðéƒéŕŕîñĝ åļļ ñöñ-çŕîţîçåļ ĴŠ/šţýļéš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/бļöçķîñĝ-ŕéšöûŕçéš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine]"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"[Éļîmîñåţé ŕéñðéŕ-бļöçķîñĝ ŕéšöûŕçéš one two three four]"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"[Ļåŕĝé ñéţŵöŕķ þåýļöåðš çöšţ ûšéŕš ŕéåļ möñéý åñð åŕé ĥîĝĥļý çöŕŕéļåţéð ŵîţĥ ļöñĝ ļöåð ţîméš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ñéţŵöŕķ-þåýļöåðš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive]"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"[Ţöţåļ šîžé ŵåš {ţöţåļБýţéš} ĶБ one two three four five six seven]"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"[Åvöîð éñöŕmöûš ñéţŵöŕķ þåýļöåðš one two three four five six seven]"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"[Åvöîðš éñöŕmöûš ñéţŵöŕķ þåýļöåðš one two three four five six seven]"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"[Mîñîƒýîñĝ ÇŠŠ ƒîļéš çåñ ŕéðûçé ñéţŵöŕķ þåýļöåð šîžéš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/mîñîƒý-çšš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone]"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"[Mîñîƒý ÇŠŠ one two]"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"[Mîñîƒýîñĝ ĴåvåŠçŕîþţ ƒîļéš çåñ ŕéðûçé þåýļöåð šîžéš åñð šçŕîþţ þåŕšé ţîmé. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/šþééð/ðöçš/îñšîĝĥţš/MîñîƒýŔéšöûŕçéš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree]"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"[Mîñîƒý ĴåvåŠçŕîþţ one two three]"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"[Ŕémövé ûñûšéð ŕûļéš ƒŕöm šţýļéšĥééţš ţö ŕéðûçé ûññéçéššåŕý бýţéš çöñšûméð бý ñéţŵöŕķ åçţîvîţý. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ûñûšéð-çšš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive]"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"[Ðéƒéŕ ûñûšéð ÇŠŠ one two]"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"[Ŕémövé ûñûšéð ĴåvåŠçŕîþţ ţö ŕéðûçé бýţéš çöñšûméð бý ñéţŵöŕķ åçţîvîţý. one two three four five six seven eight nine ten eleven twelve thirteen]"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"[Ŕémövé ûñûšéð ĴåvåŠçŕîþţ one two three]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"[Å ļöñĝ çåçĥé ļîƒéţîmé çåñ šþééð ûþ ŕéþéåţ vîšîţš ţö ýöûŕ þåĝé. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/çåçĥé-þöļîçý). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{[1 ŕéšöûŕçé ƒöûñð one two]}other{[# ŕéšöûŕçéš ƒöûñð one two three]}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"[Šéŕvé šţåţîç åššéţš ŵîţĥ åñ 郃îçîéñţ çåçĥé þöļîçý one two three four five six seven eight nine ten eleven]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"[Ûšéš éƒƒîçîéñţ çåçĥé þöļîçý öñ šţåţîç åššéţš one two three four five six seven eight nine]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"[Öþţîmîžéð îmåĝéš ļöåð ƒåšţéŕ åñð çöñšûmé ļéšš çéļļûļåŕ ðåţå. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/öþţîmîžé-îmåĝéš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"[Ƀƒîçîéñţļý éñçöðé îmåĝéš one two three]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"[Šéŕvé îmåĝéš ţĥåţ åŕé åþþŕöþŕîåţéļý-šîžéð ţö šåvé çéļļûļåŕ ðåţå åñð îmþŕövé ļöåð ţîmé. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/övéŕšîžéð-îmåĝéš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"[Þŕöþéŕļý šîžé îmåĝéš one two three]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"[Ţéxţ-бåšéð ŕéšöûŕçéš šĥöûļð бé šéŕvéð ŵîţĥ çömþŕéššîöñ (ĝžîþ, ðéƒļåţé öŕ бŕöţļî) ţö mîñîmîžé ţöţåļ ñéţŵöŕķ бýţéš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ţéxţ-çömþŕéššîöñ). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"[Éñåбļé ţéxţ çömþŕéššîöñ one two three]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"[Îmåĝé ƒöŕmåţš ļîķé ĴÞÉĜ 2000, ĴÞÉĜ XŔ, åñð ŴéбÞ öƒţéñ þŕövîðé бéţţéŕ çömþŕéššîöñ ţĥåñ ÞÑĜ öŕ ĴÞÉĜ, ŵĥîçĥ méåñš ƒåšţéŕ ðöŵñļöåðš åñð ļéšš ðåţå çöñšûmþţîöñ. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ŵéбþ). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine thirty]"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"[Šéŕvé îmåĝéš îñ ñéxţ-ĝéñ ƒöŕmåţš one two three four five six seven]"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"[Ţĥé Çŕîţîçåļ Ŕéqûéšţ Çĥåîñš бéļöŵ šĥöŵ ýöû ŵĥåţ ŕéšöûŕçéš åŕé ļöåðéð ŵîţĥ å ĥîĝĥ þŕîöŕîţý. Çöñšîðéŕ ŕéðûçîñĝ ţĥé ļéñĝţĥ öƒ çĥåîñš, ŕéðûçîñĝ ţĥé ðöŵñļöåð šîžé öƒ ŕéšöûŕçéš, öŕ ðéƒéŕŕîñĝ ţĥé ðöŵñļöåð öƒ ûññéçéššåŕý ŕéšöûŕçéš ţö îmþŕövé þåĝé ļöåð. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/çŕîţîçåļ-ŕéqûéšţ-çĥåîñš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine thirty thirtyone thirtytwo thirtythree thirtyfour thirtyfive thirtysix thirtyseven thirtyeight thirtynine forty]"},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{[1 çĥåîñ ƒöûñð one two]}other{[# çĥåîñš ƒöûñð one two]}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"[Mîñîmîžé Çŕîţîçåļ Ŕéqûéšţš Ðéþţĥ one two three four five six seven]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"[Éļéméñţ one]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"[Šţåţîšţîç one two]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"[Våļûé one]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"[Бŕöŵšéŕ éñĝîñééŕš ŕéçömméñð þåĝéš çöñţåîñ ƒéŵéŕ ţĥåñ ~1,500 ÐÖM ñöðéš. Ţĥé šŵééţ šþöţ îš å ţŕéé ðéþţĥ < 32 éļéméñţš åñð ƒéŵéŕ ţĥåñ 60 çĥîļðŕéñ/þåŕéñţ éļéméñţ. Å ļåŕĝé ÐÖM çåñ îñçŕéåšé mémöŕý ûšåĝé, çåûšé ļöñĝéŕ [šţýļé çåļçûļåţîöñš](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ƒûñðåméñţåļš/þéŕƒöŕmåñçé/ŕéñðéŕîñĝ/ŕéðûçé-ţĥé-šçöþé-åñð-çömþļéxîţý-öƒ-šţýļé-çåļçûļåţîöñš), åñð þŕöðûçé çöšţļý [ļåýöûţ ŕéƒļöŵš](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/šþééð/åŕţîçļéš/ŕéƒļöŵ). [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ðöm-šîžé). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine thirty thirtyone thirtytwo thirtythree thirtyfour thirtyfive thirtysix thirtyseven thirtyeight thirtynine forty one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{[1 ñöðé one]}other{[# ñöðéš one]}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"[Åvöîð åñ éxçéššîvé ÐÖM šîžé one two three four five six]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"[Måxîmûm ÐÖM Ðéþţĥ one two three]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"[Ţöţåļ ÐÖM Ñöðéš one two]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"[Måxîmûm Çĥîļð Éļéméñţš one two three]"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"[Åvöîðš åñ éxçéššîvé ÐÖM šîžé one two three four five six]"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"[Ļévéŕåĝé ţĥé ƒöñţ-ðîšþļåý ÇŠŠ ƒéåţûŕé ţö éñšûŕé ţéxţ îš ûšéŕ-vîšîбļé ŵĥîļé ŵéбƒöñţš åŕé ļöåðîñĝ. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ûþðåţéš/2016/02/ƒöñţ-ðîšþļåý). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour]"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"[Éñšûŕé ţéxţ ŕémåîñš vîšîбļé ðûŕîñĝ ŵéбƒöñţ ļöåð one two three four five six seven eight nine ten]"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"[Åļļ ţéxţ ŕémåîñš vîšîбļé ðûŕîñĝ ŵéбƒöñţ ļöåðš one two three four five six seven eight nine]"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"[Çåţéĝöŕý one]"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"[Çöñšîðéŕ ŕéðûçîñĝ ţĥé ţîmé šþéñţ þåŕšîñĝ, çömþîļîñĝ åñð éxéçûţîñĝ ĴŠ. Ýöû måý ƒîñð ðéļîvéŕîñĝ šmåļļéŕ ĴŠ þåýļöåðš ĥéļþš ŵîţĥ ţĥîš. one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty]"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"[Mîñîmîžé måîñ-ţĥŕéåð ŵöŕķ one two three]"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"[Mîñîmîžéš måîñ-ţĥŕéåð ŵöŕķ one two three]"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"[Ţĥé šçöŕé åбövé îš åñ éšţîmåţé öƒ ĥöŵ ļöñĝ ýöûŕ åþþ ţåķéš ţö ŕéšþöñð ţö ûšéŕ îñþûţ, îñ mîļļîšéçöñðš, ðûŕîñĝ ţĥé бûšîéšţ 5š ŵîñðöŵ öƒ þåĝé ļöåð. ΃ ýöûŕ ļåţéñçý îš ĥîĝĥéŕ ţĥåñ 50 mš, ûšéŕš måý þéŕçéîvé ýöûŕ åþþ åš ļåĝĝý. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/éšţîmåţéð-îñþûţ-ļåţéñçý). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine thirty thirtyone thirtytwo thirtythree thirtyfour thirtyfive thirtysix thirtyseven thirtyeight]"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"[Éšţîmåţéð Îñþûţ Ļåţéñçý one two three]"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"[Fîŕšţ Çöñţéñţƒûļ Þåîñţ måŕķš ţĥé ţîmé åţ ŵĥîçĥ ţĥé ƒîŕšţ ţéxţ öŕ îmåĝé îš þåîñţéð. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ƒîŕšţ-çöñţéñţƒûļ-þåîñţ). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive]"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"[Fîŕšţ Çöñţéñţƒûļ Þåîñţ one two three]"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"[Fîŕšţ ÇÞÛ Îðļé måŕķš ţĥé ƒîŕšţ ţîmé åţ ŵĥîçĥ ţĥé þåĝé'š måîñ ţĥŕéåð îš qûîéţ éñöûĝĥ ţö ĥåñðļé îñþûţ. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ƒîŕšţ-îñţéŕåçţîvé). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix]"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"[Fîŕšţ ÇÞÛ Îðļé one two]"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"[Fîŕšţ Méåñîñĝƒûļ Þåîñţ méåšûŕéš ŵĥéñ ţĥé þŕîmåŕý çöñţéñţ öƒ å þåĝé îš vîšîбļé. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ƒîŕšţ-méåñîñĝƒûļ-þåîñţ). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour]"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"[Fîŕšţ Méåñîñĝƒûļ Þåîñţ one two three]"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"[Îñţéŕåçţîvé måŕķš ţĥé ţîmé åţ ŵĥîçĥ ţĥé þåĝé îš ƒûļļý îñţéŕåçţîvé. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/çöñšîšţéñţļý-îñţéŕåçţîvé). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree]"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"[Ţîmé ţö Îñţéŕåçţîvé one two three]"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"[Šþééð Îñðéx šĥöŵš ĥöŵ qûîçķļý ţĥé çöñţéñţš öƒ å þåĝé åŕé vîšîбļý þöþûļåţéð. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/šþééð-îñðéx). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree]"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"[Šþééð Îñðéx one two]"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"[Ŕéðîŕéçţš îñţŕöðûçé åððîţîöñåļ ðéļåýš бéƒöŕé ţĥé þåĝé çåñ бé ļöåðéð. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ŕéðîŕéçţš). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo]"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"[Åvöîð mûļţîþļé þåĝé ŕéðîŕéçţš one two three four five six seven]"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"[Ţîmé Ţö Fîŕšţ Бýţé îðéñţîƒîéš ţĥé ţîmé åţ ŵĥîçĥ ýöûŕ šéŕvéŕ šéñðš å ŕéšþöñšé. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ţţƒб). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree]"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"[Ŕööţ ðöçûméñţ ţööķ {ţîméÎñMš} mš one two three four five six seven]"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"[Ŕéðûçé šéŕvéŕ ŕéšþöñšé ţîméš (ŢŢFБ) one two three four five six seven eight]"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"[Šéŕvéŕ ŕéšþöñšé ţîméš åŕé ļöŵ (ŢŢFБ) one two three four five six seven eight]"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"[Ðûŕåţîöñ one]"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"[Ñåmé one]"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"[Šţåŕţ Ţîmé one two]"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"[Ţýþé one]"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"[Çöñšîðéŕ îñšţŕûméñţîñĝ ýöûŕ åþþ ŵîţĥ ţĥé Ûšéŕ Ţîmîñĝ ÅÞÎ ţö méåšûŕé ýöûŕ åþþ'š ŕéåļ-ŵöŕļð þéŕƒöŕmåñçé ðûŕîñĝ ķéý ûšéŕ éxþéŕîéñçéš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/ûšéŕ-ţîmîñĝ). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight]"},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{[1 ûšéŕ ţîmîñĝ one two]}other{[# ûšéŕ ţîmîñĝš one two]}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"[Ûšéŕ Ţîmîñĝ måŕķš åñð méåšûŕéš one two three four five six seven]"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"[Çöñšîðéŕ åððîñĝ þŕéçöññéçţ öŕ ðñš-þŕéƒéţçĥ ŕéšöûŕçé ĥîñţš ţö éšţåбļîšĥ éåŕļý çöññéçţîöñš ţö îmþöŕţåñţ ţĥîŕð-þåŕţý öŕîĝîñš. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ƒûñðåméñţåļš/þéŕƒöŕmåñçé/ŕéšöûŕçé-þŕîöŕîţîžåţîöñ#þŕéçöññéçţ). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine]"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"[Þŕéçöññéçţ ţö ŕéqûîŕéð öŕîĝîñš one two three four five six seven]"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"[Çöñšîðéŕ ûšîñĝ <link rel=preload> ţö þŕîöŕîţîžé ƒéţçĥîñĝ ŕéšöûŕçéš ţĥåţ åŕé çûŕŕéñţļý ŕéqûéšţéð ļåţéŕ îñ þåĝé ļöåð. [Ļéåŕñ möŕé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/åûðîţš/þŕéļöåð). one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive]"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"[Þŕéļöåð ķéý ŕéqûéšţš one two three]"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"[Möŕé îñƒöŕmåţîöñ åбöûţ ţĥé þéŕƒöŕmåñçé öƒ ýöûŕ åþþļîçåţîöñ. one two three four five six seven eight nine ten eleven twelve]"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"[Ðîåĝñöšţîçš one two]"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"[Ţĥé möšţ çŕîţîçåļ åšþéçţ öƒ þéŕƒöŕmåñçé îš ĥöŵ qûîçķļý þîxéļš åŕé ŕéñðéŕéð öñšçŕééñ. Ķéý méţŕîçš: Fîŕšţ Çöñţéñţƒûļ Þåîñţ, Fîŕšţ Méåñîñĝƒûļ Þåîñţ one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo]"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"[Fîŕšţ Þåîñţ Îmþŕövéméñţš one two three]"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"[Ţĥéšé öþţîmîžåţîöñš çåñ šþééð ûþ ýöûŕ þåĝé ļöåð. one two three four five six seven eight nine ten]"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"[Öþþöŕţûñîţîéš one two]"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"[Méţŕîçš one]"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"[Éñĥåñçé ţĥé övéŕåļļ ļöåðîñĝ éxþéŕîéñçé, šö ţĥé þåĝé îš ŕéšþöñšîvé åñð ŕéåðý ţö ûšé åš šööñ åš þöššîбļé. Ķéý méţŕîçš: Ţîmé ţö Îñţéŕåçţîvé, Šþééð Îñðéx one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo]"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"[Övéŕåļļ Îmþŕövéméñţš one two three]"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"[Þéŕƒöŕmåñçé one two]"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"[Çåçĥé ŢŢĻ one two]"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"[Šîžé (ĶБ) one two]"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"[Ţîmé Šþéñţ one two]"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"[ÛŔĻ one]"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"[Þöţéñţîåļ Šåvîñĝš (ĶБ) one two three]"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"[Þöţéñţîåļ Šåvîñĝš (mš) one two three]"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"[Þöţéñţîåļ šåvîñĝš öƒ {ŵåšţéðБýţéš} ĶБ one two three four five six seven eight]"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"[Þöţéñţîåļ šåvîñĝš öƒ {ŵåšţéðMš} mš one two three four five six seven]"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"[{ţîméÎñMš} mš one two]"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"[{ţîméÎñMšŠéç} š one two]"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"[Šĥöŵ åûðîţš one two]"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"[Îñîţîåļ Ñåvîĝåţîöñ one two three]"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"[Måxîmûm çŕîţîçåļ þåţĥ ļåţéñçý: one two three four five six seven]"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"[Éŕŕöŕ¡ one]"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"[Ŕéþöŕţ éŕŕöŕ: ñö åûðîţ îñƒöŕmåţîöñ one two three four five six seven]"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"[Ļåб Ðåţå one]"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[[Ļîĝĥţĥöûšé](ĥţţþš://ðévéļöþéŕš.ĝööĝļé.çöm/ŵéб/ţööļš/ļîĝĥţĥöûšé/) åñåļýšîš öƒ ţĥé çûŕŕéñţ þåĝé öñ émûļåţéð 3Ĝ. Våļûéš åŕé éšţîmåţéð åñð måý våŕý. one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo]"},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"[Åððîţîöñåļ îţémš ţö måñûåļļý çĥéçķ one two three four five six seven]"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"[Ñöţ åþþļîçåбļé one two]"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"[Öþþöŕţûñîţý one two]"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"[Éšţîmåţéð Šåvîñĝš one two three]"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"[Þåššéð åûðîţš one two]"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"[Šçöŕé šçåļé: one two]"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"[Ţĥéŕé ŵéŕé îššûéš åƒƒéçţîñĝ ţĥîš ŕûñ öƒ Ļîĝĥţĥöûšé: one two three four five six seven eight nine ten eleven]"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"[Våļûéš åŕé éšţîmåţéð åñð måý våŕý. one two three four five six seven]"},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"[Ŵåŕñîñĝš:  one two]"}};
+
+
+},{}],48:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Las extensiones de Chrome han afectado de forma negativa al rendimiento de carga de esta página. Prueba a auditarla en modo incógnito o desde un perfil de Chrome sin extensiones."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Evaluación de la secuencia de comandos"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Análisis de la secuencia de comandos"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Te recomendamos que reduzcas el tiempo de análisis, compilación y ejecución de JavaScript. Para ello, puedes utilizar cargas útiles de JS más pequeñas. [Más información](https://developers.google.com/web/tools/lighthouse/audits/bootup)"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Reduce el tiempo de ejecución de JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Tiempo de ejecución de JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Los GIF de gran tamaño no son eficaces para mostrar contenido animado. Para usar menos bytes de la red, te recomendamos que utilices los formatos de vídeo PEG4/WebM para incluir animaciones y los formatos PNG/WebP para añadir imágenes estáticas en lugar de GIFs. [Más información](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Usa formatos de vídeo para incluir contenido animado"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Te recomendamos que uses la carga diferida con imágenes ocultas y que no aparecen en pantalla una vez que todos los recursos críticos hayan terminado de cargarse para reducir el tiempo hasta que la página es interactiva. [Más información](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Pospón la carga de imágenes que no aparecen en pantalla"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Hay recursos que bloquean el primer renderizado de la página. Te recomendamos que muestres los elementos JS/CSS críticos insertados y pospongas todos los JS/styles que no sean críticos. [Más información](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Elimina los recursos que bloqueen el renderizado"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Si la carga útil de la red es muy grande, los usuarios consumen más datos móviles y las páginas tardan más en cargarse. [Más información](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Tamaño total: {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Evita cargas útiles de red de gran tamaño"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Evita cargas útiles de red de gran tamaño"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Si minificas los archivos CSS, se puede reducir el tamaño de la carga útil de la red. [Más información](https://developers.google.com/web/tools/lighthouse/audits/minify-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minifica los archivos CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Si minificas los archivos JavaScript, se puede reducir el tamaño de la carga útil y el tiempo de análisis de la secuencia de comandos. [Más información](https://developers.google.com/speed/docs/insights/MinifyResources)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minifica los recursos JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Quita las reglas que no se usen de las hojas de estilo para reducir el número de bytes innecesarios que consume la actividad de red. [Más información](https://developers.google.com/web/tools/lighthouse/audits/unused-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Pospón la carga de archivos CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Quita el contenido JavaScript que no se use para reducir el número de bytes que consume la actividad de red."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Quita los recursos JavaScript que no se usen"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Una duración en caché más larga puede aumentar el número de visitas repetidas a tu página. [Más información](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Se ha encontrado 1 recurso}other{Se han encontrado # recursos}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Publica recursos estáticos con una política de caché eficaz"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Usa una política de caché eficaz en recursos estáticos"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Las imágenes optimizadas se cargan más rápido y consumen menos datos móviles. [Más información](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Codifica las imágenes de forma eficaz"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Muestra imágenes con un tamaño adecuado para ahorrar datos móviles y mejorar el tiempo de carga. [Más información](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Usa un tamaño adecuado para las imágenes"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Los recursos basados en texto se deberían publicar comprimidos (gzip, deflate o brotli) para minimizar el total de bytes de la red. [Más información](https://developers.google.com/web/tools/lighthouse/audits/text-compression)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Habilita la compresión de texto"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Los formatos como JPEG 2000, JPEG XR y WebP comprimen mejor las imágenes que los formatos PNG o JPEG, lo que hace que se descarguen más rápido y consuman menos datos. [Más información](https://developers.google.com/web/tools/lighthouse/audits/webp)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Publica imágenes con formatos de próxima generación"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Las cadenas de solicitud crítica que se muestran a continuación indican qué recursos son de alta prioridad. Te recomendamos que reduzcas la longitud de las cadenas, disminuyas el tamaño de los recursos o pospongas la descarga de recursos innecesarios para mejorar la carga de la página. [Más información](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Se ha encontrado 1 cadena}other{Se han encontrado # cadenas}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimiza la profundidad de las solicitudes críticas"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Los ingenieros que desarrollan navegadores recomiendan que las páginas contengan menos de ~1500 nodos de DOM. Lo ideal es conseguir una profundidad de árbol de < 32 elementos y menos de 60 elementos secundarios por cada nodo principal. Los DOM de gran tamaño aumentan el uso de la memoria, hacen que los [cálculos de estilo](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) sean más largos y producen [reinicios de flujo](https://developers.google.com/speed/articles/reflow) más caros. [Más información](https://developers.google.com/web/tools/lighthouse/audits/dom-size)"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 nodo}other{# nodos}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Evita un tamaño excesivo de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Profundidad máxima de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Nodos totales de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Evita un tamaño excesivo de DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Utiliza la función de CSS font-display para que los usuarios vean el texto mientras se carga la fuente web. [Más información](https://developers.google.com/web/updates/2016/02/font-display)"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Asegúrate de que el texto permanece visible mientras se carga la fuente web"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Todo el texto permanece visible mientras se carga la fuente web"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Categoría"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Te recomendamos que reduzcas el tiempo de análisis, compilación y ejecución de JavaScript. Para ello, puedes utilizar cargas útiles de JS más pequeñas."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimiza el trabajo del hilo principal"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimiza el trabajo del hilo principal"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"La puntuación anterior es una estimación de cuánto tarda tu aplicación en responder a las acciones de los usuarios (en milisegundos) durante el periodo de 5 s más activo de la carga de la página. Si la latencia es superior a 50 ms, es posible que los usuarios noten que la aplicación funciona con lentitud. [Más información](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Latencia de entrada estimada"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"El primer renderizado con contenido indica el momento en el que se renderiza el primer texto o la primera imagen. [Más información](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Primer renderizado con contenido"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"El primer tiempo inactivo de la CPU indica la primera vez que el hilo principal de la página está lo suficientemente inactivo para recibir acciones del usuario. [Más información](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Primer tiempo inactivo de la CPU"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"El primer renderizado significativo mide el momento en que se muestra el contenido principal de la página. [Más información](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Primer renderizado significativo"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"La métrica Tiempo hasta que está interactiva indica el momento en el que la página es totalmente interactiva. [Más información](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tiempo hasta que está interactiva"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"El índice de velocidad indica la rapidez con la que se puede ver el contenido de una página. [Más información](https://developers.google.com/web/tools/lighthouse/audits/speed-index)"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Índice de velocidad"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Las redirecciones provocan retrasos adicionales antes de que la página se pueda cargar. [Más información](https://developers.google.com/web/tools/lighthouse/audits/redirects)"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Evita que haya varias redirecciones de página"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"El tiempo hasta el primer byte indica el momento en el que el servidor envía una respuesta. [Más información](https://developers.google.com/web/tools/lighthouse/audits/ttfb)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"El documento raíz ha tardado {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Reduce los tiempos de respuesta del servidor (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Los tiempos de respuesta del servidor son rápidos (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Duración"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nombre"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Hora de inicio"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tipo"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Te recomendamos que uses la API User Timing en tu aplicación para calcular su rendimiento real durante las principales experiencias de usuario. [Más información](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 tiempo de usuario}other{# tiempos de usuario}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Medidas y marcas de User Timing"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Te recomendamos que añadas sugerencias de recursos preconnect o dns-prefetch para establecer conexiones previas con orígenes externos. [Más información](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Establece conexión previamente con los orígenes necesarios"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Te recomendamos que uses <link rel=preload> para dar prioridad a los recursos que se solicitan más tarde al cargar la página. [Más información](https://developers.google.com/web/tools/lighthouse/audits/preload)"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Carga previamente las solicitudes clave"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Consulta más información sobre el rendimiento de tu aplicación."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnósticos"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"El aspecto más importante del rendimiento es la rapidez con la que se renderizan los píxeles en la pantalla. Métricas clave: Primer renderizado con contenido y Primer renderizado significativo"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Mejoras del primer renderizado"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Estas optimizaciones pueden hacer que tus páginas se carguen más rápido."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Oportunidades"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Métricas"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Mejora la experiencia de carga general para que la página responda bien y se pueda usar lo antes posible. Métricas clave: Tiempo hasta que está interactiva, Índice de velocidad"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Mejoras generales"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Rendimiento"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Tiempo de vida en caché"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Tamaño (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Duración"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Ahorro potencial (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Ahorro potencial (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Ahorro potencial de {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Ahorro potencial de {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Mostrar auditorías"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navegación inicial"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latencia de ruta crítica máxima:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Error"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Error del informe: no hay información de la auditoría"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Datos de prueba"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) ha analizado la página actual mediante una emulación de 3G. Los valores son estimaciones y pueden variar."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Elementos adicionales que se deben comprobar manualmente"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"No aplicable"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Oportunidad"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Ahorro estimado"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Auditorías aprobadas"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Escala de puntuación:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Algunos problemas han afectado a la ejecución de Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Los valores son estimados y pueden variar."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Advertencias: "}};
+
+
+},{}],49:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chromen laajennukset heikensivät tämän sivun latausnopeutta. Yritä tarkastaa sivu incognito-tilassa tai Chrome-profiililla, johon ei ole lisätty laajennuksia."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Skriptin arviointi"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Skriptin jäsennys"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Yhteensä"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Suosittelemme vähentämään JS:n jäsentämiseen, kääntämiseen ja suorittamiseen kuluvaa aikaa. Pienempien JS-resurssien jakeleminen voi helpottaa tätä. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Vähennä JavaScriptin suorittamiseen kuluvaa aikaa"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScriptin suorittamiseen kuluva aika"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Suuret GIFit eivät ole tehokas tapa jaella animoitua sisältöä. Voit pienentää ladattavien tavujen määrää jakelemalla animaatioita MPEG4- tai WebM-muodossa ja staattisia kuvia PNG- tai WebP-muodossa. [Lue lisää](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Jakele animaatiosisältöä videomuodossa"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Suosittelemme lykkäämään poissa näkyvistä olevien ja piilotettujen kuvien lataamista, kunnes kaikki kriittiset resurssit on ladattu. Tämä lyhentää interaktiivisuutta edeltävää aikaa. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Lykkää kuvien lataamista, jos ne eivät ole näkyvissä"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resurssit estävät sivun ensimmäisen renderöinnin. Suosittelemme jakelemaan kriittiset JS- ja CSS-osat sivuun upotettuina ja lykkäämään kaikkien ei-kriittisten JS- tai tyyliosien lataamista. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Poista renderöinnin estävät resurssit"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Suuret verkkoresurssit aiheuttavat kuluja käyttäjille ja liittyvät vahvasti pitkiin latausaikoihin. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Yhteenlaskettu koko oli {totalBytes, number, bytes} kt"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Vältä valtavia verkkoresursseja"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Välttää valtavia verkkoresursseja"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"CSS-tiedostojen pienentäminen voi auttaa pienentämään verkkoresurssien kokoa. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Pienennä CSS-tiedostoja"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"JavaScript-tiedostojen pienentäminen voi auttaa pienentämään resurssien kokoa ja lyhentämään skriptin jäsentämiseen kuluvaa aikaa. [Lue lisää](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Pienennä JavaScript-tiedostoja"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Poista käyttämättömät säännöt tyylitiedostoista, jotta voit vähentää verkkotoiminnan tarpeettomasti kuluttamia tavuja. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Lykkää tarpeettoman CSS:n lataamista"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Poista käyttämättömät JavaScript-osat, jotta voit vähentää verkkotoiminnan kuluttamia tavuja."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Poista käyttämätön JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Pitkä välimuistin käyttöikä voi nopeuttaa sivun lataamista, kun käyttäjä avaa sen uudelleen. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 resurssi löydetty}other{# resurssia löydetty}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Käytä tehokasta välimuistikäytäntöä staattisten resurssien jakelemiseen"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Käyttää tehokasta välimuistikäytäntöä staattisten resurssien käsittelyyn"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimoidut kuvat latautuvat nopeammin ja kuluttavat vähemmän mobiilidataa. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Koodaa kuvat tehokkaasti"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Näytä sopivan kokoisia kuvia, jotta voit pienentää mobiilidatan kulutusta ja latausaikoja. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Määritä kuvien koko oikein"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Tekstipohjaiset resurssit on hyvä pakata ennen jakelua (gzip, deflate tai brotli), jotta ladattavien tavujen määrä voidaan minimoida. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Ota tekstin pakkaus käyttöön"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Kuvamuodot, kuten JPEG 2000, JPEG XR ja WebP, pakkaavat sisältöä usein paremmin kuin PNG tai JPEG, minkä vuoksi ne auttavat nopeuttamaan latauksia ja vähentämään datan kulutusta. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Jakele kuvat seuraavan sukupolven muodoissa"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Alla olevat kriittiset pyyntöketjut kertovat, minkä resurssien lataaminen priorisoidaan. Suosittelemme parantamaan sivun latausaikaa lyhentämällä ketjuja, pienentämällä resurssien latauskokoa ja lykkäämällä tarpeettomien resurssien lataamista. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ketju löydetty}other{# ketjua löydetty}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimoi kriittisten pyyntöjen syvyys"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Selainten kehittäjät suosittelevat käyttämään sivulla enintään noin 1 500:aa DOM-noodia. Sopiva puun syvyys on korkeintaan 32 elementtiä ja alle 60 ala- tai ylätason elementtiä. Suuri DOM voi lisätä muistin käyttöä, pidentää [tyylilaskelmia](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) ja aiheuttaa työläitä [asettelun uudelleenjuoksutuksia](https://developers.google.com/speed/articles/reflow). [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 noodi}other{# noodia}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Vältä liian suurta DOM:ää"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"DOM:n enimmäissyvyys"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"DOM-noodien kokonaismäärä"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Välttää liian suurta DOM:ää"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Käytä CSS:n kirjasimennäyttöominaisuutta, jotta voit varmistaa, että käyttäjä näkee tekstin myös verkkofonttien lataamisen aikana. [Lue lisää](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Varmista, että teksti pysyy näkyvissä verkkofontin lataamisen aikana"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Kaikki teksti pysyy näkyvissä verkkofontin lataamisen aikana"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Luokka"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Suosittelemme vähentämään JS:n jäsentämiseen, kääntämiseen ja suorittamiseen kuluvaa aikaa. Pienempien JS-resurssien jakaminen voi helpottaa tätä."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimoi pääsäikeen työkuorma"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimoi pääsäikeen työkuorman"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Yllä oleva tulos on millisekunteina annettu arvio siitä, kuinka kauan sovelluksellasi kestää vastata käyttäjän syötteeseen sivun lataamisen kiireisimmän, viiden sekunnin mittaisen jakson aikana. Jos viive on yli 50 ms, sovelluksesi voi toimia käyttäjien mielestä hitaasti. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Arvioitu syöttöviive"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Ensimmäinen merkityksellinen piirtäminen kertoo, milloin sivun ensisijainen sisältö tulee näkyviin. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Ensimmäinen sisällön renderöinti"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"CPU:n ensimmäinen toimettomuusjakso kertoo, milloin sivun pääsäikeen tilanne sallii syötteiden käsittelyn. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU:n ensimmäinen toimettomuusjakso"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Ensimmäinen merkityksellinen renderöinti kertoo, milloin sivun ensisijainen sisältö tulee näkyviin. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Ensimmäinen merkityksellinen renderöinti"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interaktiivisuutta edeltävä aika kertoo, milloin sivun kaikki osat ovat käytettävissä. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Interaktiivisuutta edeltävä aika"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Nopeusindeksi kertoo, kuinka nopeasti sivun sisältö tulee näkyviin. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Nopeusindeksi"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Uudellenohjaukset viivästyttävät sivun lataamista. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Vältä useita uudelleenohjauksia"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Ensimmäistä tavua edeltävä aika kertoo, kuinka kauan kestää, ennen kuin palvelimesi lähettää vastauksen. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Päädokumentti käytti {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Lyhennä palvelimen vastausaikoja (ensimmäistä tavua edeltävä aika)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Palvelimen vastausajat ovat lyhyitä (ensimmäistä tavua edeltävä aika)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Kesto"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nimi"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Aloitusaika"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tyyppi"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Suosittelemme käyttämään sovelluksen kehittämisessä User Timing ‑sovellusliittymää mittaamaan todellista toimivuutta tärkeiden käyttökokemuksien aikana. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 käyttäjän ajankäyttömerkintä}other{# käyttäjän ajankäyttömerkintää}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"User Timing ‑merkinnät ja ‑mitat"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Suosittelemme lisäämään sivulle yhteyttä tai DNS:n noutamista edeltäviä resurssivihjeitä, joiden avulla yhteydet tärkeisiin kolmannen osapuolen kohteisiin voidaan muodostaa etukäteen. [Lue lisää](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Muodosta yhteydet pakollisiin kohteisiin etukäteen"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Suosittelemme käyttämään <link rel=preload>-tagia, jotta voit priorisoida resursseja, joiden noutamista pyydetään sivun lataamisen myöhemmässä vaiheessa. [Lue lisää](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Lataa tärkeät pyynnöt etukäteen"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Lisätietoja sovelluksen toiminnasta"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostiikka"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Tehokkuuden tärkein osa-alue on se, kuinka nopeasti pikselit renderöidään näytölle. Tärkeimmät mittarit ovat ensimmäinen sisällön renderöinti ja ensimmäinen merkityksellinen renderöinti."},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Ensimmäistä renderöintiä koskevat parannusehdotukset"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Nämä optimointikeinot voivat nopeuttaa sivun lataamista."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Suositukset"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Tiedot"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Paranna latauskokemusta kokonaisuutena, jotta sivu on responsiivisempi ja käytettävissä mahdollisimman pian. Tärkeimmät mittarit ovat interaktiivisuutta edeltävä aika ja nopeusindeksi."},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Yleiset parannusehdotukset"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Tehokkuus"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Välimuistin käyttöikä"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Koko (kt)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Käytetty aika"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL-osoite"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potentiaalinen säästö (kt)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potentiaalinen säästö (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potentiaalinen säästö: {wastedBytes, number, bytes} kt"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potentiaalinen säästö: {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Näytä tarkastukset"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Ensimmäinen navigointi"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Kriittisen polun enimmäisviive:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Virhe!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Raporttivirhe: ei tarkastustietoja"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboratoriodata"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysoi nykyisen sivun 3G-emulaation avulla. Arvot ovat arvioita ja voivat vaihdella."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Lisää manuaalisesti tarkistettavia kohteita"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Ei sovellu"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Suositus"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Arvioitu säästö"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Hyväksytyt tarkastukset"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Pisteasteikko:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Lighthousen suorituksessa havaittiin ongelmia:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Arvot ovat arvioita ja voivat vaihdella."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Varoitukset: "}};
+
+
+},{}],50:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Nagkaroon ng negatibong epekto ang mga extension ng Chrome sa performance ng pag-load ng page na ito. Subukang i-audit ang page sa incognito mode o mula sa isang profile sa Chrome nang walang extension."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Pagsusuri ng Script"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Pag-parse ng Script"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Kabuuan"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Pag-isipang bawasan ang oras na ginugugol sa pag-parse, pag-compile, at pagpapagana ng JS. Maaaring mapansin mong nakakatulong dito ang paghahatid ng mas maliliit na payload ng JS. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Pabilisin ang pagpapagana ng JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Bilis ng pagpapagana ng JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Hindi mahusay ang malalaking GIF sa paghahatid ng animated na content. Pag-isipang gumamit ng mga MPEG4/WebM na video para sa mga animation at PNG/WebP para sa mga static na larawan sa halip na GIF para makatipid sa mga byte ng network. [Matuto pa](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Gumamit ng mga format ng video para sa animated na content"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Pag-isipang i-lazy load ang mga larawang wala sa screen at nakatago kapag tapos nang mag-load ang lahat ng mahalagang resource para mapabilis ang time to interactive. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Ipagpaliban ang mga larawang wala sa screen"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Bina-block ng mga resource ang first paint ng iyong page. Pag-isipang ihatid ang mahalagang JS/CSS inline at ipagpaliban ang lahat ng hindi mahalagang JS/istilo. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Alisin ang mga resource na nagba-block ng pag-render"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Malaki ang nagagastos ng mga user sa malalaking payload ng network, at malaki ang kaugnayan ng mga ito sa matagal na pag-load. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Ang kabuuang laki ay {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Iwasan ang malalaking payload ng network"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Umiiwas sa malalaking payload ng network"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Kapag pinaliit ang mga CSS file, maaaring lumiit ang payload ng network. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Paliitin ang CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Kapag pinaliit ang mga JavaScript file, maaaring lumiit ang payload at bumilis ang pag-parse ng script. [Matuto pa](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Paliitin ang JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Alisin ang mga hindi nagamit na panuntunan mula sa mga stylesheet para mabawasan ang mga hindi kinakailangang byte na nakokonsumo ng aktibidad sa network. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Ipagpaliban ang hindi nagamit na CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Alisin ang hindi nagamit na JavaScript para mabawasan ang mga byte na nakokonsumo ng aktibidad sa network."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Alisin ang hindi nagamit na JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Maaaring mapabilis ng mahabang lifetime ng cache ang mga umuulit na pagbisita sa iyong page. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Nakakita ng 1 resource}one{Nakakita ng # resource}other{Nakakita ng # na resource}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Maghatid ng mga static na asset nang may mahusay na patakaran sa cache"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Gumagamit ng mahusay na patakaran sa cache sa mga static na asset"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Mas mabilis mag-load ang mga na-optimize na page at mas kaunti ang nakokonsumong cellular data ng mga ito. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Mahusay na mag-encode ng mga larawan"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Maghatid ng mga larawang naaangkop ang laki para makatipid sa cellular data at mapabilis ang pag-load. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Iangkop ang laki ng mga larawan"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Dapat ihatid ang mga text-based na resource nang may compression (gzip, deflate, o brotli) para mabawasan ang kabuuang byte ng network. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"I-enable ang compression ng text"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Kadalasan, mas mahusay ang compression ng mga format ng imahe gaya ng JPEG 2000, JPEG XR, at WebP kaysa sa compression ng PNG o JPEG, kaya mas mabilis ang pag-download at mas kaunti ang nakokonsumong data ng mga ito. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Maghatid ng mga larawan sa mga makabagong format"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Ipinapakita sa iyo ng Critical Request Chains sa ibaba kung anong mga resource ang nilo-load nang may mataas na priyoridad. Pag-isipang paikliin ang mga chain, paliitin ang mga dina-download sa mga resource, o ipagpaliban ang pag-download ng mga hindi kinakailangang resource para mapabilis ang pag-load ng page [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Nakakita ng 1 chain}one{Nakakita ng # chain}other{Nakakita ng # na chain}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"I-minimize ang Lalim ng Mahahalagang Kahilingan"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Inirerekomenda ng mga engineer ng browser na hindi umabot sa ~1,500 ang mga node ng DOM sa mga page. Ang pinakamainam ay isang lalim ng tree na < 32 elemento at wala pang 60 child/parent na elemento. Ang malaking DOM ay maaaring magresulta sa mas malakas na paggamit ng memory, at magpahaba ng [mga pagkalkula ng istilo](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), at gumawa ng mga magastos na [reflow ng layout](https://developers.google.com/speed/articles/reflow). [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 node}one{# node}other{# na node}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Umiwas sa masyadong malaking DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximum na Lalim ng DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Kabuuang Bilang ng Mga Node ng DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Umiiwas sa masyadong malaking DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Gamitin ang feature na font-display ng CSS para matiyak na nakikita ng user ang text sa pag-load ng mga webfont. [Matuto pa](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Tiyaking patuloy na nakikita ang text sa pag-load ng webfont"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Patuloy na nakikita ang lahat ng text sa pag-load ng webfont"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorya"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Pag-isipang bawasan ang oras na ginugugol sa pag-parse, pag-compile, at pagpapagana ng JS. Maaaring mapansin mong nakakatulong dito ang paghahatid ng mas maliliit na payload ng JS."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Bawasan ang gawain sa pangunahing thread"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Binabawasan ang gawain sa pangunahing thread"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Ang marka sa itaas ay isang pagtataya ng bilis ng pagtugon ng iyong app sa input ng user, na nasa milliseconds, sa pinakaabalang 5 segundong window ng pag-load ng page. Kung mas mataas sa 50 ms ang iyong latency, maaaring ituring ng mga user na mabagal ang app mo. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Tinatayang Latency ng Input"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Minamarkahan ng First Contentful Paint ang oras ng pag-paint sa unang text o larawan. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"First Contentful Paint"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Minamarkahan ng First CPU Idle ang unang beses kung kailan hindi abala ang pangunahing thread ng page at maaari itong mangasiwa ng input. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"First CPU Idle"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Sinusukat ng First Meaningful Paint ang bilis ng pagpapakita sa pangunahing content ng isang page. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"First Meaningful Paint"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Minamarkahan ng Interactive ang oras kung kailan ganap na naging interactive ang page. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Time to Interactive"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Ipinapakita ng Speed Index ang bilis ng pag-populate ng mga content ng isang page. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Speed Index"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Nagpapasimula ang mga pag-redirect ng mga karagdagang pagkaantala bago ma-load ang page. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Iwasan ang mga pag-redirect sa maraming page"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Tinutukoy ng Time To First Byte ang oras kung kailan nagpapadala ng tugon ang iyong server. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Inabot nang {timeInMs, number, milliseconds} ms ang root na dokumento"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Pabilisin ang pagtugon ng server (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Masyadong matagal ang pagtugon ng server (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Tagal"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Pangalan"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Oras ng Pagsisimula"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Uri"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Pag-isipang gumamit ng User Timing API sa iyong app para sukatin ang makatotohanang performance ng app mo sa mahahalagang karanasan ng user. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 timing ng user}one{# timing ng user}other{# na timing ng user}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Mga marka at sukat ng User Timing"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Pag-isipang magdagdag ng resource hint na preconnect o dns-prefetch para makapagtakda ng mga paunang koneksyon sa mahahalagang third-party na origin. [Matuto pa](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Mag-preconnect sa mga kinakailangang origin"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Pag-isipang gumamit ng <link rel=preload> para mabigyang-priyoridad ang pagkuha ng mga resource na kasalukuyang hinihiling, sa pag-load ng page, para sa ibang pagkakataon. [Matuto pa](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"I-preload ang mahahalagang kahilingan"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Higit pang impormasyon tungkol sa performance ng iyong application."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Mga Diagnostic"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Ang pinakamahalagang aspeto ng performance ay ang bilis ng pag-render ng mga pixel sa screen. Mahahalagang sukatan: First Contentful Paint, First Meaningful Paint"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Mga Pagpapahusay sa First Paint"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Maaaring mapabilis ng mga pag-optimize na ito ang pag-load ng iyong page."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Mga Pagkakataon"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Mga Sukatan"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Pagandahin ang pangkalahatang karanasan sa pag-load para bumilis ang pagtugon ng page at magamit ito kaagad. Mahahalagang sukatan: Time to Interactive, Speed Index"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Mga Pangkalahatang Pagpapahusay"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Performance"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL ng Cache"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Laki (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Oras na Ginugol"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Maaaring Matipid (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Maaaring Matipid (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Maaaring makatipid ng {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Maaaring makatipid ng {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Ipakita ang mga pag-audit"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Unang Navigation"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maximum na latency ng critical path:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Nagka-error!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Error sa ulat: walang impormasyon sa pag-audit"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Data ng Lab"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Ang pagsusuri ng [Lighthouse](https://developers.google.com/web/tools/lighthouse/) sa kasalukuyang page sa ginayang 3G. Tinatantya at maaaring mag-iba ang mga value."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Mga karagdagang item na manual na susuriin"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Hindi naaangkop"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Pagkakataon"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Tinatayang Matitipid"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Mga pumasang pag-audit"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Sukatan ng marka:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"May mga isyung nakakaapekto sa pagpapatakbong ito ng Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Tinataya lang at maaaring mag-iba ang mga value."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Mga Babala: "}};
+
+
+},{}],51:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Les extensions Chrome ont eu un impact négatif sur les performances de chargement de la page. Essayez de contrôler la page en mode navigation privée ou depuis un profil Chrome sans extensions."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Évaluation des scripts"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Analyse des scripts"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Envisagez de réduire le temps consacré à l'analyse, la compilation et l'exécution de JS. La livraison de charges utiles JS plus petites peut vous aider. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Réduisez le temps d'exécution de JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Délai d'exécution de JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Les grandes images GIF sont inefficaces pour diffuser du contenu animé. Envisagez d'utiliser des vidéos MPEG4/WebM pour les animations et PNG/WebP pour les images statiques au lieu d'images GIF afin d'économiser des octets réseau. [En savoir plus](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Utilisez des formats vidéo pour le contenu animé"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Envisagez de charger des images masquées ou hors écran après le chargement de toutes les ressources essentielles afin de réduire le délai avant interactivité. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Différez le chargement des images hors écran"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Des ressources bloquent la première visualisation (first paint) de votre page. Envisagez de diffuser des feuilles JS/CSS essentielles en ligne et de différer la diffusion de toutes les feuilles JS/de style non essentielles. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Éliminez les ressources qui bloquent le rendu"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Les charges utiles des grands réseaux coûtent de l'argent réel aux utilisateurs et sont fortement corrélées aux délais de chargement interminables. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"La taille totale était de {totalBytes, number, bytes} Ko"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Évitez d'énormes charges utiles de réseau"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Éviter d'énormes charges utiles de réseau"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"La réduction des fichiers CSS peut réduire la taille des charges utiles de réseau. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Réduisez la taille des ressources CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"La minimisation des fichiers JavaScript peut réduire la taille des charges utiles et la durée d'analyse des scripts. [En savoir plus](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Réduisez la taille des ressources JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Supprimez les règles inutilisées des feuilles de style afin de réduire la quantité d'octets utilisés inutilement par l'activité réseau. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Différez le chargement des ressources CSS inutilisées"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Supprimez les ressources JavaScript inutilisées pour réduire la quantité d'octets consommés par l'activité réseau."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Supprimez les ressources JavaScript inutilisées"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Une longue durée de vie du cache peut accélérer les visites répétées sur votre page. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ressource trouvée}one{# ressource trouvée}other{# ressources trouvées}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Diffusez des éléments statiques grâce à des règles de cache efficaces"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Utiliser des règles de cache efficaces sur les éléments statiques"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Les images optimisées se chargent plus rapidement et consomment moins de données mobiles. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Encodez les images de manière efficace"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Diffusez des images de taille appropriée afin d'économiser des données mobiles et réduire le temps de chargement. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Dimensionnez correctement les images"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Les ressources textuelles doivent être diffusées compressées (Gzip, Deflate ou Brotli) pour réduire le nombre total d'octets du réseau. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Activez la compression de texte"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Les formats d'image comme JPEG 2000, JPEG XR et WebP proposent souvent une meilleure compression que les formats PNG ou JPEG. Par conséquent, les téléchargements sont plus rapides et la consommation de données est réduite. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Diffusez des images aux formats nouvelle génération"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Les Chaînes de demandes critiques ci-dessous vous montrent quelles ressources sont chargées avec une priorité élevée. Envisagez de réduire la longueur des chaînes et la taille de téléchargement des ressources ou de reporter le téléchargement de ressources inutiles afin d'améliorer le chargement des pages. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 chaîne trouvée}one{# chaîne trouvée}other{# chaînes trouvées}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Réduisez la profondeur des demandes critiques"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Les ingénieurs en navigation recommandent que les pages contiennent moins de 1 500 nœuds de DOM environ. La zone d'écoute idéale est une profondeur d'arborescence inférieure à 32 éléments et contenant moins de 60 éléments enfant/parent. Un grand DOM peut accroître l'utilisation de la mémoire, entraîner de plus longs [calculs de style](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) et des [redispositions] coûteuses (https://developers.google.com/speed/articles/reflow). [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 nœud}one{# nœud}other{# nœuds}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Évitez une taille excessive de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Profondeur maximum de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Total des nœuds de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Éviter une taille excessive de DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Utilisez la fonction d'affichage de la police CSS afin que le texte soit visible par l'utilisateur pendant le chargement des polices Web. [En savoir plus](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Assurez-vous que le texte reste visible pendant le chargement des polices Web"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"La totalité du texte reste visible pendant le chargement des polices Web"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Catégorie"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Envisagez de réduire le temps consacré à l'analyse, la compilation et l'exécution de JavaScript. La livraison de charges utiles JavaScript plus petites peut vous aider."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Réduisez le travail du thread principal"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Réduire le travail du thread principal"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Le score ci-dessus est une estimation du temps en millisecondes que prend votre application pour réagir à l'intervention de l'utilisateur, pendant la fenêtre de pointe de 5 s de chargement de page. Si le temps de latence est supérieur à 50 ms, les utilisateurs peuvent percevoir votre application comme étant lente. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Estimation du temps de latence avant intervention"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"La statistique \"first contentful paint\" indique le moment où le premier texte ou la première image sont affichés. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"First Contentful Paint"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"La statistique \"Premier processeur inactif\" marque la première fois que le thread principal de la page est suffisamment silencieux pour gérer l'entrée. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Premier processeur inactif"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"La statistique \"Premier passage significatif\" mesure quand le contenu principal d'une page est visible. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Premier passage significatif"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"La statistique \"Temps avant interactivité\" indique quand la page est entièrement interactive. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Délai avant interactivité"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"L'indice de vitesse indique la rapidité avec laquelle le contenu d'une page est disponible. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Indice de vitesse"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Les redirections entraînent des retards supplémentaires avant que la page ne puisse être chargée. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Évitez les redirections de page multiples"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"La valeur \"Délai avant premier octet\" (Time To First Byte) identifie l'heure à laquelle votre serveur envoie une réponse. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Le document racine a pris {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Réduisez les délais de réponse du serveur (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Les délais de réponse du serveur sont faibles (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Durée"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nom"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Heure de début"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Type"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Envisagez de doter votre application de l'API User Timing pour mesurer les performances réelles de votre application lors d'expériences utilisateur clés. [En savoir plus](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{[=1]1 temps utilisateur}one{# temps utilisateur}other{# temps utilisateur}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Marques et mesures du temps utilisateur"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Envisagez d'ajouter des indices de ressources de préconnexion ou dns-prefetch pour établir les premières connexions avec des origines tierces importantes. [En savoir plus](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Connectez-vous à l'avance aux origines souhaitées"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Envisagez d'utiliser <link rel=preload> pour hiérarchiser la récupération des ressources actuellement requises pour le chargement ultérieur de la page. [En savoir plus](https://developers.google.com/web/ntools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Préchargez les demandes clés"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Plus d'informations sur les performances de votre application."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostics"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"L'aspect le plus essentiel des performances est la rapidité avec laquelle les pixels sont affichés à l'écran. Statistiques clés : First Contentful Paint, First Meaningful Paint"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Amélioration de First Paint"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Ces optimisations peuvent accélérer le chargement de votre page."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Opportunités"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Statistiques"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Améliorez l'expérience globale de chargement, afin que la page soit réactive et disponible dès que possible. Statistiques clés : délai avant interactivité, indice de vitesse"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Améliorations générales"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Performances"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Cache de la valeur TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Taille (Ko)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Temps passé"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Économies potentielles (Ko)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Économies potentielles (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Économies potentielles de {wastedBytes, number, bytes} Ko"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Économies potentielles de {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Afficher les audits"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navigation initiale"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latence de chemin d'accès critique maximale :"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Erreur"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Erreur de rapport : pas d'information d'audit"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Données de test"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Analyse [Lighthouse](https://developers.google.com/web/tools/lighthouse/) de la page actuelle sur 3G émulée. Les valeurs sont des estimations et peuvent varier."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Autres éléments à vérifier manuellement"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Non applicable"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Opportunité"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Estimation des économies"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Audits réussis"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Échelle de score :"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Cette exécution de Lighthouse a rencontré des problèmes :"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Les valeurs sont estimées et peuvent varier."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Avertissements : "}};
+
+
+},{}],52:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"תוספים ל-Chrome השפיעו לרעה על ביצועי הטעינה של הדף הזה. כדאי לבדוק את הדף במצב גלישה בסתר או באמצעות פרופיל Chrome שאינו כולל תוספים."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"הערכת סקריפט"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"ניתוח סקריפט"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"סה\"כ"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"כדאי לשקול את האפשרות לקצר את הזמן הדרוש לניתוח, הידור וביצוע JS. לשם כך כדאי להשתמש במטענים ייעודיים (payload) קטנים יותר של JS. [מידע נוסף] (https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"יש לקצר את זמן הביצוע של JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"זמן ביצוע של JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"קובצי GIF גדולים לא מעבירים תוכן אנימציה בצורה יעילה. כדי לצמצם את מספר הבייטים שמועברים ברשת, במקום קובצי GIF כדאי לשקול את האפשרות להשתמש בסרטוני MPEG4/WebM בשביל אנימציות ובקובצי PNG/WebP בשביל תמונות סטטיות. [מידע נוסף](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"יש להשתמש בפורמטים של וידאו כדי להציג תוכן אנימציה"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"כדי לקצר את הזמן עד לאינטראקטיביות (Time to Interactive) כדאי לשקול את האפשרות לבצע טעינה הדרגתית של תוכן שאינו מופיע במסך ושל תמונות מוסתרות, אחרי שכל המשאבים הקריטיים סיימו להיטען. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"יש לעכב טעינה של תמונות שאינן מופיעות במסך"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"משאבים חוסמים את העיבוד הראשון (First Paint) בדף. כדאי לשקול את האפשרות לספק תוכן JS/CSS קריטי באופן מוטבע ולעכב את כל תוכן ה-JS/סגנונות שאינם קריטיים. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"יש להימנע ממשאבים שחוסמים עיבוד"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"מטענים ייעודיים (payload) בנפח גדול המועברים ברשת עולים למשתמשים כסף ולרוב מאריכים את זמני הטעינה. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"הגודל הכולל היה {totalBytes, number, bytes} ‏KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"יש להימנע מהעברה של מטענים ייעודיים ענקיים (payload) ברשת"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"נמנע מהעברה של מטענים ייעודיים ענקיים (payload) ברשת"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"הקטנת קובצי CSS יכולה לצמצם את הגודל של מטענים ייעודיים (payload) שמועברים ברשת. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"יש להקטין קובצי CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"הקטנת קובצי JavaScript יכולה לצמצם את המטען הייעודי (payload) ולקצר את משך הזמן הנדרש לניתוח סקריפט. [מידע נוסף](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"יש לקצר את קוד JavaScript למינימום ההכרחי"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"כדי לצמצם צריכה לא נחוצה של בייטים בפעילות ברשת, יש להסיר מגיליונות סגנון כללים שאינם בשימוש. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"יש לעכב טעינה של CSS שאינו בשימוש"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"יש להסיר JavaScript שאינו בשימוש כדי לצמצם צריכת בייטים על-ידי פעילות ברשת."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"יש להסיר JavaScript שאינו בשימוש"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"משך חיים ארוך של מטמון יכול לזרז את הביקורים החוזרים בדף. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{נמצא משאב אחד}two{נמצאו # משאבים}many{נמצאו # משאבים}other{נמצאו # משאבים}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"יש להציג נכסים סטטיים בעזרת מדיניות מטמון יעילה"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"יש להשתמש במדיניות מטמון יעילה בנכסים סטטיים"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"תמונות שעברו אופטימיזציה נטענות מהר יותר וצורכות פחות נתונים בחבילת הגלישה. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"יש לקודד תמונות בצורה יעילה"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"הצגת תמונות שהגודל שלהן הוגדר בצורה נכונה חוסכת צריכת נתונים בחבילת הגלישה ומקצרת את זמן הטעינה. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"יש להגדיר את גודל התמונות בצורה נכונה"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"הצגת משאבים המבוססים על טקסט צריכה להתבצע עם דחיסה (gzip‏, deflate או brotli) כדי לצמצם את סך הבייטים שמועברים ברשת. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"יש להפעיל דחיסת טקסט"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"לעתים קרובות, פורמטים של תמונות כמו JPEG 2000‏, JPEG XR ו-WebP מספקים דחיסה טובה יותר מאשר PNG או JPEG. שימוש בפורמטים האלה מקצר את זמן ההורדות ומצמצם את צריכת הנתונים. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"יש להציג תמונות בפורמטים עדכניים"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"בקטע 'שרשראות בקשה קריטיות' שבהמשך מוצגים המשאבים שנטענים עם עדיפות גבוהה. כדי לשפר את מהירות טעינת הדף, מומלץ לקצר את השרשראות, להקטין את גודל ההורדה של משאבים או לעכב את ההורדה של משאבים לא נחוצים. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{נמצאה שרשרת אחת}two{נמצאו # שרשראות}many{נמצאו # שרשראות}other{נמצאו # שרשראות}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"יש לצמצם את העומק של בקשות קריטיות"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"מפתחי דפדפנים ממליצים שדפים יכילו פחות מכ-1,500 צומתי DOM. המצב האופטימלי הוא עץ בעומק של פחות מ-32 אלמנטים ופחות מ-60 אלמנטים ברמת צאצא/אב. DOM גדול יכול להגדיל את צריכת הזיכרון, להאריך [חישובי סגנון](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) ולגרום לזרימות חוזרות של פריסה שצורכות נתונים רבים [layout reflows](https://developers.google.com/speed/articles/reflow). [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{צומת אחד}two{# צמתים}many{# צמתים}other{# צמתים}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"יש להימנע מ-DOM גדול מדי"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"עומק DOM מרבי"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"המספר הכולל של צומתי DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"נמנע מ-DOM גדול מדי"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"שימוש בתכונת תצוגת הגופן של CSS מבטיח שהטקסט מוצג למשתמש בזמן טעינה של webfonts. [מידע נוסף](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"יש לוודא שטקסט ממשיך להופיע במהלך טעינת webfont"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"כל הטקסט ממשיך להופיע במהלך טעינות של webfont"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"קטגוריה"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"כדאי לשקול את האפשרות לקצר את הזמן הדרוש לניתוח, הידור וביצוע JS. לשם כך כדאי להשתמש במטענים ייעודיים (payload) קטנים יותר של JS."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"צריך לצמצם את העבודה על התהליכון הראשי"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"מצמצם את העבודה על התהליכון הראשי"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"הערך שלמעלה הוא אומדן של משך הזמן הנדרש לאפליקציה כדי להגיב לקלט של משתמש. הערך מצוין באלפיות שנייה ומתייחס ל-5 השניות העמוסות ביותר בטעינת דף. אם זמן האחזור ארוך מ-50 אלפיות שנייה, המשתמשים עלולים להגיע למסקנה שהאפליקציה איטית. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"אומדן זמן האחזור של קלט"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"המדד 'הצגת תוכן ראשוני' (FCP) מציין את הזמן שבו הטקסט או התמונה הראשונים מוצגים. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"הצגת התוכן הראשוני"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"הערך 'מצב ראשון של חוסר פעילות ב-CPU' ‏(First CPU Idle) מציין את הפעם הראשונה שבה התהליכון הראשי של הדף פנוי מספיק בשביל להגיב לקלט. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"מצב ראשון של חוסר פעילות ב-CPU"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"הערך 'הצגת התוכן העיקרי' מציין מתי התוכן העיקרי של הדף מוצג. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"הצגת התוכן העיקרי"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"'אינטראקטיבי' מציין את הזמן שבו הדף הופך להיות לגמרי אינטראקטיבי. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"זמן עד לאינטראקטיביות"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"מדד המהירות (Speed Index) מראה באיזו מהירות מתמלא התוכן המוצג בדף. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"מדד מהירות (Speed Index)"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"הפניות אוטומטיות מוסיפות עיכובים לטעינת הדף. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"יש להימנע מהפניות אוטומטיות מרובות"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"'זמן עד בייט ראשון' (Time To First Byte) הוא פרק הזמן שחולף עד שהשרת שולח תגובה. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"טעינת מסמך השורש ארכה {timeInMs, number, milliseconds} אלפיות שנייה"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"יש לקצר את זמני התגובה של השרת (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"זמני התגובה של השרת ארוכים (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"משך זמן"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"שם"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"שעת התחלה"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"סוג"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"כדי למדוד את ביצועי האפליקציה בפועל במהלך חוויות משתמש חשובות, מומלץ להוסיף לאפליקציה את User Timing API. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{תזמון משתמש אחד}two{# תזמוני משתמש}many{# תזמוני משתמש}other{# תזמוני משתמש}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"סימונים ומדידות של User Timing"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"כדאי לשקול את האפשרות להוסיף את רמזי המשאבים preconnect או dns-prefetch כדי ליצור מראש קישורים אל מקורות חשובים של צד שלישי. [מידע נוסף](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"יש להתחבר מראש למקורות נדרשים"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"כדאי לשקול את האפשרות להשתמש ב-<link rel=preload> כדי לקבוע את סדר העדיפויות של אחזור משאבים שנדרשים בשלב מאוחר יותר של טעינת הדף. [מידע נוסף](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"יש לטעון מראש בקשות עיקריות"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"מידע נוסף לגבי ביצועי האפליקציה."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"ניתוחים"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"היבט הביצועים הקריטי ביותר הוא מהירות העיבוד של פיקסלים במסך. ערכי מפתח: הצגת התוכן הראשוני, הצגת התוכן העיקרי"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"שיפורים בעיבוד ראשון"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"האופטימיזציות האלה יכולות לקצר את זמני טעינת הדף."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"הזדמנויות"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"ערכים"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"צריך לשפר את חוויית הטעינה הכללית, כך שהדף יגיב ויהיה מוכן לשימוש במהירות האפשרית. ערכי מפתח: זמן עד לאינטראקטיביות (Time to Interactive), מדד מהירות (Speed Index)"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"סך השיפורים"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"ביצועים"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"אורך חיים (TTL) של מטמון"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"גודל (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"משך הזמן שנדרש"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"כתובת אתר"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"חיסכון פוטנציאלי (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"פוטנציאל חיסכון (אלפיות שנייה)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"חיסכון פוטנציאלי של {wastedBytes, number, bytes} ‏KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"חיסכון פוטנציאלי של {wastedMs, number, milliseconds} אלפיות שנייה"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} אלפיות שנייה"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} שניות"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"הצגת בדיקות"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"ניווט התחלתי"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"זמן אחזור מקסימלי של נתיב קריטי:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"שגיאה!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"שגיאה בדוח: אין מידע על הבדיקה"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"נתוני בדיקה"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"ניתוח הדף הנוכחי בהדמיית 3G באמצעות [Lighthouse]‏(https://developers.google.com/web/tools/lighthouse/). הערכים הם אומדנים, והם עשויים להשתנות."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"פריטים נוספים שיש לבדוק באופן ידני"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"לא רלוונטי"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"הזדמנות"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"אומדן חיסכון"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"בדיקות עם ציון 'עובר'"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"סולם תוצאות:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"היו בעיות שהשפיעו על ההרצה הזו של Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"הערכים מהווים אומדן והם עשויים להשתנות."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"אזהרות: "}};
+
+
+},{}],53:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome एक्सटेंशन ने इस पेज के लोड परफ़ॉर्मेंस पर नकारात्मक रूप से असर डाला है. 'गुप्त मोड' में या बिना किसी एक्सटेंशन के Chrome प्रोफ़ाइल से पेज ऑडिट करके देखें."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"स्क्रिप्ट मूल्यांकन"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"स्क्रिप्ट पार्स"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"कुल"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"JS को पार्स करने, कंपाइल करने और एक्ज़ीक्यूट करने में लगने वाला समय कम करने पर विचार करें. आप पाएंगे कि इसके ज़रिए छोटे-छोटे JS पेलोड डिलीवर करने में मदद मिलती है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"JavaScript क्रियान्वयन समय कम करें"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript क्रियान्वयन समय"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"बड़े जीआईएफ़ ऐनिमेटेड सामग्री डिलीवर करने में नाकाफ़ी होते हैं. नेटवर्क बाइट बचाने के इरादे से जीआईएफ़ का इस्तेमाल करने के बजाय, ऐनिमेशन के लिए MPEG4/WebM वीडियो और स्थिर इमेज के लिए PNG/WebP का इस्तेमाल करने पर विचार करें. [ज़्यादा जानें](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"ऐनिमेट की गई सामग्री के लिए वीडियो फ़ॉर्मेट का इस्तेमाल करें"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"इंटरेक्टिव में लगने वाला समय कम करने के लिए, सभी अहम संसाधन लोड हो जाने के बाद ऑफ़स्क्रीन और छिपी हुई इमेज को धीरे-धीरे लोड करने पर विचार करें. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"ऑफ़स्क्रीन इमेज टालें"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"संसाधन आपके पेज के पहले पेंट को ब्लॉक कर रहे हैं. अहम JS/CSS इनलाइन वितरित करने और सभी गैर-अहम JS/शैलियों को टालने पर विचार करें. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"रेंडर ब्लॉक करने वाले संसाधनों को खत्म करें"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"बड़े नेटवर्क वाले पेलोड के लिए उपयोगकर्ताओं को ज़्यादा रकम खर्च करनी पड़ती है और उन पर लोड होने में ज़्यादा समय भी लगता है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"कुल आकार {totalBytes, number, bytes} केबी था"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"बहुत ज़्यादा नेटवर्क पेलोड से बचें"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"भारी नेटवर्क पेलोड से बचाता है"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"CSS फ़ाइलों का आकार कम करने से नेटवर्क पेलोड आकार कम किए जा सकते हैं. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"CSS कम करें"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"JavaScript फ़ाइलों को छोटा करने से पेलोड का आकार और स्क्रिप्ट पार्स करने का समय कम हो सकता है. [ज़्यादा जानें](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"JavaScript का आकार कम करें"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"नेटवर्क गतिविधि में खर्च होने वाले गैर-ज़रूरी बाइट कम करने के लिए स्टाइल-शीट से इस्तेमाल नहीं किए गए नियमों को हटाएं. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"इस्तेमाल नहीं किए गए CSS को टालें"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"नेटवर्क गतिविधि में खर्च होने वाले बाइट में कमी करने के लिए इस्तेमाल नहीं किया गया JavaScript हटाएं."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"इस्तेमाल नहीं किया गया JavaScript हटाएं"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"लंबे कैश लाइफ़टाइम से आपके पेज पर दोहराए जाने वाले विज़िट की गति बढ़ सकती है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 संसाधन मिला}one{# संसाधन मिले}other{# संसाधन मिले}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"कुशल कैश नीति के साथ स्थिर एसेट ऑफ़र करें"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"स्थिर एसेट पर कुशल कैश नीति का इस्तेमाल करता है"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"ऑप्टिमाइज़ की गई इमेज तेज़ी से लोड होती हैं और इसमें कम सेल्युलर डेटा खर्च होता है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"इमेज को कुशलता से एन्कोड करें"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"ऐसी इमेज ऑफ़र करें जिनका आकार सही हो ताकि सेल्युलर डेटा बचाया जा सके और लोड समय को बेहतर बनाया जा सके. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"सही तरीके के आकार वाली इमेज"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"कुल नेटवर्क बाइट को कम से कम करने के लिए, लेख आधारित संसाधन कंप्रेशन (gzip, deflate या brotli) के साथ ऑफ़र किए जाने चाहिए. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"लेख कंप्रेशन चालू करें"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000, JPEG XR और WebP जैसे इमेज फ़ॉर्मेट में अक्सर PNG या JPEG के मुकाबले बेहतर कंप्रेशन मिलता है, जिसका मतलब है कि डाउनलोड तेज़ी से होते हैं और इनमें कम डेटा खर्च होता है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"इमेज अगली जेनरेशन के फ़ॉर्मेट में ऑफ़र करें"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"नीचे दी गई अहम अनुरोध शृंखलाएं आपको वे संसाधन दिखाती हैं जो उच्च प्राथमिकता से भरपूर हैं. शृंखलाओं की अवधि कम करने पर विचार करें, जिससे संसाधनों का डाउनलोड आकार कम हो जाएगा या पेज लोड को बेहतर बनाने के लिए गैर-ज़रूरी संसाधनों का डाउनलोड टल जाएगा. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 शृंखला मिली}one{# शृंखलाएं मिलीं}other{# शृंखलाएं मिलीं}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"अहम अनुरोधों की गहराई कम से कम करें"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"ब्राउज़र इंजीनियर सुझाव देते हैं कि पेज में ~1,500 से कम DOM नोड होने चाहिए. सबसे सही आंकड़ा है < 32 एलीमेंट वाली ट्री गहराई और 60 से कम चिल्ड्रन/पेरेंट एलीमेंट. ज़्यादा बड़े DOM से मेमोरी का इस्तेमाल बढ़ सकता है, जिससे ज़्यादा लंबे [स्टाइल कैल्युलेशन](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) हो सकते हैं और इनसे महंगे [लेआउट रीफ़्लो](https://developers.google.com/speed/articles/reflow) बन सकते हैं. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 नोड}one{# नोड}other{# नोड}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"बहुत ज़्यादा बड़े DOM आकार से बचें"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"सबसे ज़्यादा DOM गहराई"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"कुल DOM नोड"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"बहुत ज़्यादा बड़े DOM आकार से बचता है"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"यह पक्का करने के लिए फ़ॉन्ट-डिसप्ले CSS फ़ीचर का फ़ायदा उठाएं कि वेबफ़ॉन्ट लोड होने के दौरान उपयोगकर्ता को लेख दिखाई देता रहे. [ज़्यादा जानें](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"पक्का करें कि वेबफ़ॉन्ट लोड होने के दौरान लेख दिखाई देता रहे"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"वेबफ़ॉन्ट लोड होने के दौरान सभी लेख दिखाई देते रहते हैं"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"श्रेणी"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"JS को पार्स करने, कंपाइल करने और एक्ज़ीक्यूट करने में लगने वाला समय कम करने पर विचार करें. आप देखेंगे कि इसके ज़रिए छोटे-छोटे JS पेलोड डिलीवर करने में मदद मिलती है."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"मुख्य थ्रेड के काम को कम करना"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"मुख्य थ्रेड के काम को कम करता है"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"ऊपर दिया गया स्कोर एक अनुमान है कि पेज लोड होने की सबसे व्यस्त 5 सेकंड की विंडो में आपके ऐप्लिकेशन को उपयोगकर्ता इनपुट का जवाब देने में, मिलीसेकंड में कितना समय लगेगा. अगर आपकी प्रतीक्षा अवधि 60 मिलीसेकंड से ज़्यादा है, तो उपयोगकर्ता आपके ऐप्लिकेशन को धीमा मान सकते हैं. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"अनुमानित इनपुट प्रतीक्षा समय"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"फ़र्स्ट कॉन्टेंटफ़ुल पेंट वह समय चिह्नित करता है जब पहले लेख या इमेज को पेंट किया गया हो. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"उपयोगी सामग्री वाला पहला पेंट"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"इस्तेमाल में नहीं पहला सीपीयू (CPU), वह पहला समय चिह्नित करता है जब पेज का मुख्य थ्रेड इनपुट को संभालने के लिए काफ़ी होता है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"पहला सीपीयू (CPU) इस्तेमाल में नहीं"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"पहला सार्थक पेंट उस समय का मापन करता है जब किसी पेज की शुरुआती सामग्री दिखाई देती है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"पहला सार्थक पेंट"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"इंटरेक्टिव वह समय चिह्नित करता है जब पेज पूरी तरह इंटरेक्टिव हो जाता है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"इंटरएक्टिव में लगने वाला समय"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"गति इंडेक्स दिखाता है कि किसी पेज की सामग्री विज़ुअल रूप से कितनी तेज़ी से पॉपुलेट होती हैं. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"गति इंडेक्स"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"'रीडायरेक्ट' पेज लोड किए जाने से पहले और ज़्यादा प्रतीक्षा जोड़ता है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"एक से ज़्यादा पेज रीडायरेक्ट करने से बचें"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"पहली बाइट का समय, उस समय की पहचान करता है जब आपका सर्वर कोई जवाब भेजता है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"रूट दस्तावेज़ को {timeInMs, number, milliseconds} मिलीसेकंड लगे"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"सर्वर प्रतिक्रिया समय घटाएं (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"सर्वर के जवाब देने के समय धीमे हैं (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"कुल समय"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"नाम"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"शुरुआत का समय"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"प्रकार"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"प्रमुख उपयोगकर्ता अनुभवों के दौरान, असली दुनिया के माप तैयार करने के लिए अपने ऐप्लिकेशन को 'उपयोगकर्ता समय API (एपीआई)' के ज़रिए तैयार करने पर विचार करें. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 उपयोगकर्ता समय}one{# उपयोगकर्ता समय}other{# उपयोगकर्ता समय}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"उपयोगकर्ता समय अंक और मापन"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"तीसरे पक्ष के अहम मूल से जल्दी कनेक्शन बनाने के लिए प्री-कनेक्ट या dns-प्रीफ़ेच संसाधन संकेत जोड़ने पर विचार करें. [ज़्यादा जानें](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"ज़रूरी मूल से प्री-कनेक्ट करें"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"ऐसे संसाधन फ़ेच करने को प्राथमिकता देने के लिए <link rel=preload> का इस्तेमाल करने पर विचार करें जिनका फ़िलहाल पेज लोड में बाद में अनुरोध किया गया है. [ज़्यादा जानें](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"प्रमुख अनुरोधों को पहले से लोड करें"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"आपके ऐप्लिकेशन के परफ़ॉर्मेंस के बारे में ज़्यादा जानकारी."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"निदान"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"परफ़ॉर्मेंस का सबसे अहम पहलू यह है कि स्क्रीन पर पिक्सेल कितनी तेज़ी से रेंडर होते हैं. प्रमुख मेट्रिक: उपयोगी सामग्री वाला पहला पेंट, पहला उपयोगी पेंट"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"पहले पेंट के सुधार"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"इन ऑप्टिमाइज़ेशन से आपका पेज लोड होने की गति बढ़ सकती है."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"अवसर"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"मेट्रिक"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"पूरे लोडिंग अनुभव को बेहतर बनाएं ताकि पेज जवाब दे और जल्दी से जल्दी इस्तेमाल के लिए तैयार हो जाए. प्रमुख मेट्रिक: इंटरेक्टिव में लगने वाला समय, गति इंडेक्स"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"समस्त सुधार"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"परफ़ॉर्मेंस"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"कैश TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"आकार (केबी)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"बिताया गया समय"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"यूआरएल"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"हो सकने वाली बचत (केबी)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"हो सकने वाली बचत (‍मिली सेकंड)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"{wastedBytes, number, bytes} केबी की हो सकने वाली बचत"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"{wastedMs, number, milliseconds} मिलीसेकंड की हो सकने वाली बचत"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} मिलीसेकंड"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} सेकंड"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"ऑडिट दिखाएं"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"शुरुआती नेविगेशन"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"पाथ का ज़्यादा से ज़्यादा अहम प्रतीक्षा समय:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"गड़बड़ी!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"गड़बड़ी की रिपोर्ट करें: कोई ऑडिट जानकारी नहीं"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"किसी नई या दुबारा जाँची जाने वाली ऐप्लिकेशन के लिए तैयार किया गया डेटा"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"एम्युलेट किए गए 3G पर मौजूदा पेज का [लाइटहाउस](https://developers.google.com/web/tools/lighthouse/) विश्लेषण. मान अनुमानित हैं और इनमें अंतर हो सकता है."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"मैन्युअल रूप से देखे जाने वाले और ज़्यादा आइटम"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"लागू नहीं"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"अवसर"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"अनुमानित बचत"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"पास हुए ऑडिट"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"स्कोर स्केल:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"कुछ समस्याएं आने के कारण Lighthouse के इस रन पर असर पड़ा है:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"मान अनुमानित हैं और इनमें अंतर हो सकता है."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"चेतावनियां: "}};
+
+
+},{}],54:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chromeova proširenja negativno su utjecala na izvedbu učitavanja ove stranice. Pokušajte pregledati stranicu anonimno ili putem Chromeovog profila bez proširenja."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Procjena skripte"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Raščlamba skripte"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Ukupno"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Savjetujemo vam da skratite vrijeme potrebno za raščlambu, kompiliranje i izvršavanje JS-a. Isporuka manjih JS-ova mogla bi vam pomoći da to postignete. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Skratite vrijeme izvršavanja JavaScripta"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Vrijeme izvršavanja JavaScripta"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Veliki GIF-ovi nisu učinkoviti za isporuku animiranog sadržaja. Savjetujemo vam da umjesto GIF-a upotrebljavate MPEG4/WebM videozapise za animacije i PNG/WebP za statične slike da biste smanjili količinu mrežnih bajtova. [Saznajte više](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Upotrebljavajte formate videozapisa za animirani sadržaj"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Za slike izvan zaslona i skrivene slike savjetujemo odgođeno učitavanje nakon što se učitaju svi kritični resursi da biste skratili vrijeme do interaktivnosti. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Odgodite slike izvan zaslona"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resursi blokiraju prvo bojenje stranice. Savjetujemo vam da kritičan JS/CSS isporučite umetnuto i da odgodite sve nekritične JS-ove/stilove. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Uklonite resurse koji blokiraju generiranje"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Veliki mrežni resursi korisnicima uzrokuju stvarne novčane troškove i usko koreliraju s dugim vremenom učitavanja. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Ukupna veličina bila je {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Izbjegavajte ogromne mrežne resurse"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Izbjegava ogromne mrežne resurse"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Umanjenjem CSS datoteka mogu se smanjiti veličine mrežnih resursa. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Umanjite CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Umanjenjem JavaScript datoteka mogu se smanjiti veličine resursa i skratiti vrijeme raščlambe skripte. [Saznajte više](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Umanjite JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Iz stilskih tablica uklonite nekorištena pravila da biste smanjili nepotrebnu potrošnju bajtova u mrežnoj aktivnosti. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Odgodite nekorišteni CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Uklonite JavaScript koji se ne koristi da biste smanjili potrošnju bajtova u mrežnoj aktivnosti."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Uklonite nekorišteni JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Dugotrajno predmemoriranje može ubrzati ponovljene posjete vašoj stranici. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Pronađen je jedan resurs}one{Pronađen je # resurs}few{Pronađena su # resursa}other{Pronađeno je # resursa}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Poslužite statične elemente s pravilima učinkovitog predmemoriranja"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Upotrebljava pravila učinkovitog predmemoriranja za statične elemente"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimizirane slike učitavaju se brže i troše manje mobilnih podataka. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Kodirajte slike učinkovito"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Poslužite slike prikladnih veličina da biste uštedjeli mobilne podatke i poboljšali vrijeme učitavanja. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Postavite slike u odgovarajućoj veličini"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Tekstualni resursi trebaju se posluživati s kompresijom (gzip, deflate ili brotli) radi minimiziranja ukupne količine mrežnih bajtova. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Omogućite sažimanje teksta"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Formati slike kao što su JPEG 2000, JPEG XR i WebP često pružaju bolje sažimanje nego PNG ili JPEG, što znači brža preuzimanja i manju potrošnju podataka. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Poslužite slike u modernim formatima"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Lanci kritičkih zahtjeva u nastavku prikazuju koji se resursi učitavaju s visokim prioritetom. Savjetujemo vam da skratite duljinu lanaca, smanjite veličinu resursa za preuzimanje ili odgodite preuzimanje resursa koji nisu nužni kako biste poboljšali učitavanje stranice. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Pronađen je jedan lanac}one{Pronađen je # lanac}few{Pronađena su # lanca}other{Pronađeno je # lanaca}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimizirajte dubinu kritičnih zahtjeva"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Inženjeri preglednika preporučuju da stranice sadrže manje od ~1500 čvorova DOM-a. Idealno je da je dubina stabla manja od 32 elementa i da ima manje od 60 elemenata podređenih/nadređenih jedinica. Veliki DOM može pojačati upotrebu memorije, uzrokovati dulje [izračune stilova](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) i proizvesti zahtjevna [preoblikovanja izgleda](https://developers.google.com/speed/articles/reflow). [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{Jedan čvor}one{# čvor}few{# čvora}other{# čvorova}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Izbjegavajte pretjeranu veličinu DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksimalna dubina DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Ukupan broj čvorova DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Izbjegava pretjeranu veličinu DOM-a"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Iskoristite CSS značajku za prikaz fontova kako bi tekst bio vidljiv korisnicima dok se web-fontovi učitavaju. [Saznajte više](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Neka tekst ostaje vidljiv tijekom učitavanja web-fontova"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Sav tekst ostaje vidljiv tijekom učitavanja web-fontova"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorija"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Savjetujemo vam da skratite vrijeme potrebno za raščlambu, kompiliranje i izvršavanje JS-a. Isporuka manjih JS-ova mogla bi vam pomoći da to postignete."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimizirajte rad glavne niti"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimizira rad glavne niti"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Prethodni je rezultat procjena vremena koje je potrebno da vaša aplikacija reagira na korisnički unos, u milisekundama, tijekom najintenzivnijih pet sekundi učitavanja stranice. Ako je latencija viša od 50 ms, korisnici mogu doživjeti vašu aplikaciju kao usporenu. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Procijenjena latencija unosa"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Prvo renderiranje sadržaja označava vrijeme renderiranja prvog teksta ili slike. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Prvo bojenje sadržaja"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Prvi procesor u mirovanju označava prvi trenutak u kojem je glavna nit stranice dovoljno neopterećena da bi obradila unos. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Prvi procesor u mirovanju"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Prvo smisleno bojenje mjeri kada je vidljiv primarni sadržaj stranice. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Prvo smisleno bojenje"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interaktivnost označava vrijeme u kojem stranica postaje potpuno interaktivna. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Vrijeme do interaktivnosti"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Indeks brzine prikazuje koliko se brzo sadržaj stranice vidljivo popunjava. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Indeks brzine"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Preusmjeravanja uvode dodatna kašnjenja prije nego što se stranica može učitati. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Izbjegavajte višestruka preusmjeravanja stranica"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Vrijeme do prvog bajta navodi vrijeme u koje poslužitelj šalje odgovor. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Za korijenski dokument bilo je potrebno {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Skratite vremena odgovora poslužitelja (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Poslužitelj odgovara sporo (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Trajanje"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Naziv"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Vrijeme početka"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Vrsta"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Savjetujemo vam da na aplikaciju primijenite API za praćenje korisničkog vremena radi mjerenja izvedbe aplikacije u stvarnom vremenu tijekom važnih korisničkih doživljaja. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{Jedno praćenje korisničkog vremena}one{# praćenje korisničkog vremena}few{# praćenja korisničkog vremena}other{# praćenja korisničkog vremena}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Oznake i izmjere Praćenja korisničkog vremena"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Savjetujemo vam da dodate nagovještaje resursa za rano povezivanje ili prethodno dohvaćanje DNS-a radi uspostavljanja ranih veza s važnim izvorima trećih strana. [Saznajte više](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Rano se povežite s potrebnim izvorima"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Savjetujemo vam da koristite <link rel=preload> da biste dali prednost dohvaćanju resursa koji se trenutačno traže kasnije u učitavanju stranice. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Unaprijed učitajte ključne zahtjeve"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Više informacija o izvedbi vaše aplikacije."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Dijagnostika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Najkritičniji je aspekt izvedbe brzina kojom se pikseli generiraju na zaslonu. Ključni mjerni podaci: Prvo bojenje sadržaja, Prvo smisleno bojenje"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Poboljšanja prvog bojenja"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Ove optimizacije mogu ubrzati učitavanje stranice."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Prilike"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Mjerni podaci"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Poboljšajte općeniti doživljaj učitavanja tako da stranica bude responzivna i spremna za upotrebu što je prije moguće. Ključni mjerni podaci: Vrijeme do interaktivnosti, Indeks brzine"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Općenita poboljšanja"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Izvedba"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL predmemoriranja"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Veličina (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Utrošeno vrijeme"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potencijalna ušteda (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potencijalna ušteda (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potencijalna ušteda {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potencijalna ušteda {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Prikažite preglede"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Početna navigacija"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maksimalna latencija kritičkog puta:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Pogreška!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Pogreška izvješća: nema podataka o pregledu"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboratorijski podaci"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analiza trenutačne stranice na emuliranoj 3G mreži. Vrijednosti su procijenjene i mogu varirati."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Dodatne stavke za ručnu provjeru"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nije primjenjivo"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Prilika"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Procijenjena ušteda"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Uspješni pregledi"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Ljestvica rezultata:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Na ovo izvođenje Lighthousea utjecale su neke poteškoće:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Vrijednosti se procjenjuju i mogu se razlikovati."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Upozorenja: "}};
+
+
+},{}],55:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Egyes Chrome-bővítmények kedvezőtlenül befolyásolták az oldal betöltési teljesítményét. Próbálkozzon az oldal inkognitómódban vagy bővítmények nélküli Chrome-profilból történő ellenőrzésével."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Szkriptértékelés"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Szkriptelemzés"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Összes"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Érdemes csökkenteni a JS elemzésére, összeállítására és végrehajtására fordított időt. Ebben segítségére lehet a kisebb JS-hasznosadat-forgalom. [További információ](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Csökkentse a JavaScript végrehajtási idejét"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript végrehajtási ideje"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"A nagy méretű GIF-ek nem megfelelők az animált tartalmak megjelenítéséhez. Érdemes MPEG4/WebM formátumú videókat használni az animációkhoz, illetve a PNG/WebP formátumot a statikus képekhez a GIF-ek helyett, hiszen így csökkenteni tudja a hálózati adatforgalmat. [További információ](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)."},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Használjon videoformátumot az animált tartalmakhoz"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Vegye fontolóra a képernyőn kívüli és a rejtett képek késleltetett, a kritikus erőforrások betöltődésének végét követő betöltését, az interaktivitásig tartó idő csökkentése érdekében. [További információ](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Késleltesse a képernyőn kívüli képek betöltését"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Az erőforrások blokkolják az oldal első leképezését. Fontolja meg a kritikus JS/CSS beillesztését, továbbá az összes nem kritikus JS/stílus késleltetését. [További információ](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Távolítsa el a megjelenítést gátló erőforrásokat"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"A nagy hálózati terhelés valódi költséggel jár a felhasználóknak, és jelentősen megnöveli a betöltési időt. [További információ](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"A teljes méret {totalBytes, number, bytes} kB volt"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Kerülje a nagyon nagy hálózati hasznosadat-forgalmat"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"A nagyon nagy hálózati terhelés elkerülése"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"A CSS-fájlok minimalizálása csökkentheti a hálózati hasznosadat-forgalmat. [További információ](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minimalizálja a CSS-fájlokat"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"A JavaScript-fájlok minimalizálásával csökkenthető a hasznosadat-forgalom és a szkriptelemzési idő. [További információ](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minimalizálja a JavaScript-kódot"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Távolítsa el a nem használt szabályokat a stíluslapokból a hálózati tevékenység adatforgalmának csökkentése érdekében. [További információ](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Késleltesse a felhasználatlan CSS-t"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"A nem használt JavaScript-kód eltávolítása a hálózati tevékenység adatforgalmának csökkentéséhez."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Távolítsa el a nem használt JavaScript-kódot"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"A hosszú gyorsítótári élettartam felgyorsíthatja az oldal ismételt látogatását. [További információ](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 erőforrás található}other{# erőforrás található}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Jelenítse meg a statikus eszközöket hatékony gyorsítótár-házirend használatával"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Használjon hatékony gyorsítótár-házirendet a statikus eszközöknél"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Az optimalizált képek gyorsabban töltődnek be, és kisebb mobiladat-forgalommal járnak. [További információ](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Kódolja hatékonyan a képeket"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Használjon olyan képeket, amelyek megfelelő méretükkel elősegítik a mobiladat-forgalom csökkentését és a betöltési idő javulását. [További információ](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Méretezze megfelelően a képeket"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"A szöveges alapú erőforrásokat tömörítéssel (gzip, Deflate vagy Brotli) célszerű megjeleníteni a teljes hálózati adatforgalom minimalizálása érdekében. [További információ](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Engedélyezze a szövegtömörítést"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Az olyan képformátumok, mint a JPEG 2000, a JPEG XR és a WebP gyakran jobb tömörítést biztosítanak a PNG vagy a JPEG formátumnál, ami gyorsabb letöltést és kisebb adatforgalmat jelent. [További információ](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Jelenítse meg a képeket következő generációs formátumokban"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Az alábbi kritikuslekérdezés-láncok megmutatják, hogy milyen források töltődnek be prioritással. Az oldalbetöltés javítása érdekében fontolja meg a láncok hosszának csökkentését, a letöltött erőforrások méretének csökkentését, vagy a felesleges erőforrások letöltésének késleltetését. [További információ.](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 lánc található}other{# lánc található}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimalizálja a kritikus lekérdezések mélységét"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"A böngészőket fejlesztő mérnökök azt javasolják, hogy az oldalakon ~1500 DOM-csomópontnál kevesebb legyen. A legkedvezőbb a 32 elemnél kisebb és a 60 alárendelt/fölérendelt elemnél kisebb famélység. A nagy DOM növelheti a memóriahasználatot, és hosszabb [stílusszámítást](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), valamint költséges [elrendezés-újraszámítást](https://developers.google.com/speed/articles/reflow) eredményezhet. [További információ](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 csomópont}other{# csomópont}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Kerülje a túl nagy DOM-méretet"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximális DOM-mélység"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Összes DOM-csomópont"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Kerüli a túlzó DOM-méretet"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Használja a betűtípus-megjelenítő CSS-funkciót annak biztosításához, hogy a szöveg már a webes betűtípusok betöltődése alatt látható legyen a felhasználó számára. [További információ](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Biztosítsa, hogy a szöveg látható marad a webes betűtípusok betöltése során"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Az összes szöveg látható marad a webes betűtípusok betöltésekor"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategória"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Érdemes csökkenteni a JS elemzésére, összeállítására és végrehajtására fordított időt. Ebben segítségére lehet a kisebb JS-hasznosadat-forgalom."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimalizálja a fő szál terhelését"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimalizálja a fő szál terhelését"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"A fenti pontszám annak a becsült értéke, hogy az alkalmazás mennyi idő alatt reagál – ezredmásodpercben (ms) megadva – a felhasználói adatbevitelre az oldalbetöltés legforgalmasabb 5 másodperces időkeretében. Ha a várakozási idő meghaladja az 50 ms-ot, a felhasználók késlekedést észlelhetnek az alkalmazás használata közben. [További információ](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Becsült bemeneti késés"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Az első vizuális tartalomválasz azt az időpontot jelöli, amikor a rendszer megkezdi az első szöveg vagy kép megjelenítését. [További információ.](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Első, tartalommal rendelkező leképezés"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Az első processzor-üresjárat mutató az első olyan alkalmat jelöli, amikor az oldal főszálának aktivitása elég alacsony ahhoz, hogy kezelni lehessen a bevitt mennyiséget. [További információ](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Első processzor-üresjárat"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Az első releváns leképezés azt méri, hogy mikor válik láthatóvá az adott oldal elsődleges tartalma. [További információ](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Első releváns leképezés"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Az „Interaktív” mutató azt az időt jelzi, amíg az oldal teljesen interaktívvá nem válik. [További információ](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Interaktivitásig eltelt idő"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"A Sebességindex mutató azt jelzi, hogy az adott oldal tartalmai milyen gyorsan válnak láthatóvá. [További információ](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Sebességindex"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Az átirányítások még azelőtt eredményeznek további késéseket, hogy az oldal betöltődhetne. [További információ](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Kerülje a többszörös oldalátirányítást"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Az „első bájtig eltelt idő” mutató az Ön szervere válaszidejét jelöli. [További információ](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"A gyökérdokumentum betöltése ennyi időt vett igénybe: {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Csökkentse a szerver válaszidejét (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Alacsony a szerver válaszideje (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Időtartam"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Név"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Kezdés ideje"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Típus"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Érdemes felhasználnia alkalmazásában a User Timing API-t, amellyel valós használat során mért teljesítményadatokat kaphat a legfontosabb felhasználói műveletekről. [További információ.](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 felhasználói időmérés}other{# felhasználói időmérés}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Felhasználói időzítőjelek és intézkedések"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Vegye fontolóra előcsatlakozási vagy előzetes DNS-lehívási erőforrástippek hozzáadását, hogy korai kapcsolatokat hozhasson létre harmadik felek fontos forrásaival. [További információ](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Csatlakozzon előre a szükséges forrásokhoz"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Fontolja meg a <link rel=preload> parancs használatát az olyan erőforrások lekérdezésének rangsorolásához, amelyek az adott pillanatban az oldal betöltése során később következőként szerepelnek. [További információ](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Töltse be előre a kulcsfontosságú kéréseket"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"További információ alkalmazása teljesítményéről."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnosztika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"A teljesítmény legfontosabb szempontja az, hogy milyen gyorsan jelennek meg a képpontok a képernyőn. Legfontosabb mutatók: Első, tartalommal rendelkező leképezés, Első releváns leképezés"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Az első leképezést érintő fejlesztések"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Ezek az optimalizációk felgyorsíthatják oldala betöltési idejét."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Lehetőségek"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Mutatók"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Növelje az átfogó betöltési élményt annak érdekében, hogy az oldal reszponzív legyen, és a lehető legrövidebb időn belül használhatóvá váljon. Főbb mutatók: interaktivitásig eltelt idő, sebességindex"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Átfogó javítások"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Teljesítmény"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Gyorsítótár-TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Méret (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Eltöltött idő"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potenciális megtakarítás (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potenciális megtakarítás (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"{wastedBytes, number, bytes} kB potenciális megtakarítás"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potenciális megtakarítás értéke: {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Ellenőrzések megjelenítése"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Kezdeti navigáció"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Kritikus elérési út maximális várakozási ideje:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Hiba!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Jelentési hiba: nincs ellenőrzési információ"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboradatok"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Az aktuális oldal [Lighthouse](https://developers.google.com/web/tools/lighthouse/)-elemzése emulált 3G-n. Az értékek becslések, legközelebb eltérhetnek."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"További manuálisan elemzendő elemek"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nem alkalmazható"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Lehetőség"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Becsült megtakarítás"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Sikeresen teljesített ellenőrzések"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Pontozási skála:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"A Lighthouse-futtatást befolyásoló problémák fordultak elő:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Az értékek becsültek és változhatnak."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Figyelmeztetések: "}};
+
+
+},{}],56:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Ekstensi Chrome berpengaruh negatif terhadap performa pemuatan halaman ini. Coba audit halaman dalam mode penyamaran atau dari profil Chrome tanpa ekstensi."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Evaluasi Skrip"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Penguraian Skrip"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Pertimbangkan mengurangi waktu yang dihabiskan untuk mengurai, mengompilasi, dan mengeksekusi JS. Anda mungkin menemukan bahwa mengirim payload JS yang lebih kecil akan membantu mengurangi waktu. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Mengurangi waktu eksekusi JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Waktu eksekusi JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"GIF berukuran besar tidak efisien untuk menayangkan konten animasi. Pertimbangkan untuk menggunakan video MPEG4/WebM sebagai animasi dan PNG/WebP sebagai gambar statis untuk menggantikan GIF guna menghemat byte jaringan. [Pelajari lebih lanjut](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Gunakan format video untuk konten animasi"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Pertimbangkan pemuatan lambat di balik layar dan gambar tersembunyi setelah semua resource kritis selesai dimuat untuk mengurangi waktu interaktif. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Tunda gambar di balik layar"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resource memblokir paint pertama halaman. Pertimbangkan mengirim inline JS/CSS kritis dan menunda semua JS/gaya yang tidak kritis. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Hilangkan resource yang memblokir render"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Payload jaringan yang besar menimbulkan biaya yang tinggi bagi pengguna dan berkorelasi erat dengan waktu pemuatan yang lama. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Ukuran total {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Menghindari payload jaringan yang sangat besar"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Menghindari payload jaringan yang sangat besar"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Mengecilkan file CSS dapat mengurangi ukuran payload jaringan. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Kecilkan CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Mengecilkan file JavaScript dapat mengurangi ukuran payload dan waktu penguraian skrip. [Pelajari lebih lanjut](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Kecilkan ukuran JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Menghapus aturan yang tidak digunakan dari stylesheet untuk mengurangi byte yang tidak diperlukan tetapi digunakan oleh aktivitas jaringan. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Tunda CSS yang tidak digunakan"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Menghapus JavaScript yang tidak digunakan untuk mengurangi byte yang digunakan oleh aktivitas jaringan."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Hapus JavaScript yang tidak digunakan"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Durasi cache yang panjang dapat mempercepat kunjungan berulang ke halaman. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 resource ditemukan}other{# resource ditemukan}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Tayangkan aset statis dengan kebijakan cache yang efisien"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Menggunakan kebijakan cache yang efisien pada aset statis"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Gambar yang dioptimalkan dimuat lebih cepat dan menghabiskan lebih sedikit kuota. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Enkode gambar secara efisien"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Menayangkan gambar yang berukuran sesuai untuk menghemat kuota dan meningkatkan waktu pemuatan. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Ubah ukuran gambar dengan tepat"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Resource berbasis teks harus ditayangkan dengan kompresi (gzip, deflate, atau brotli) untuk meminimalkan total byte jaringan. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Aktifkan kompresi teks"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Format gambar seperti JPEG 2000, JPEG XR, dan WebP biasanya memberikan kompresi yang lebih baik daripada PNG atau JPEG, sehingga download lebih cepat dan konsumsi kuota lebih kecil. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Tayangkan gambar dalam format generasi berikutnya"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Rantai Permintaan Penting di bawah menampilkan resource apa saja yang dimuat dengan prioritas tinggi. Pertimbangkan mengurangi panjang rantai, mengurangi ukuran download resource, atau menunda download resource yang tidak penting untuk mempercepat pemuatan halaman. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 rantai ditemukan}other{# rantai ditemukan}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimalkan Kedalaman Permintaan Penting"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Engineer browser merekomendasikan halaman berisi kurang dari ~1.500 node DOM. Titik yang efektif adalah kedalaman hierarki < 32 elemen dan kurang dari 60 elemen turunan/induk. DOM yang besar dapat meningkatkan penggunaan memori, menyebabkan [penghitungan gaya] yang lebih lama(https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), dan menghasilkan [penyesuaian tata letak] yang mahal(https://developers.google.com/speed/articles/reflow). [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 node}other{# node}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Menghindari ukuran DOM yang berlebihan"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Kedalaman DOM Maksimum"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Total Node DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Menghindari ukuran DOM yang berlebihan"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Memanfaatkan fitur CSS tampilan font untuk memastikan teks terlihat oleh pengguna saat font web sedang dimuat. [Pelajari lebih lanjut](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Pastikan teks tetap terlihat selama pemuatan font web"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Semua teks tetap terlihat selama pemuatan font web"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategori"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Pertimbangkan mengurangi waktu yang dihabiskan untuk mengurai, mengompilasi, dan mengeksekusi JS. Anda mungkin menemukan bahwa mengirim payload JS yang lebih kecil akan membantu mengurangi waktu."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimalkan pekerjaan thread utama"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Meminimalkan pekerjaan thread utama"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Skor di atas adalah perkiraan durasi yang diperlukan aplikasi untuk merespons masukan pengguna, dalam milidetik, selama durasi 5 detik tersibuk saat pemuatan halaman. Jika latensi di atas 50 md, pengguna dapat menganggap aplikasi lambat. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Perkiraan Latensi Masukan"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"First Contentful Paint menandai waktu saat teks atau gambar pertama di-paint. [Pelajari lebih lanjut] (https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"First Contentful Paint"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"CPU Pertama Tidak Ada Aktivitas menandai waktu pertama kalinya thread utama halaman menjadi agak tenang untuk menangani masukan. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU Pertama Tidak Ada Aktivitas"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"First Meaningful Paint mengukur waktu saat konten utama halaman terlihat. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"First Meaningful Paint"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Metrik Interaktif menandai waktu halaman menjadi interaktif sepenuhnya. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Waktu untuk Interaktif"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Indeks Kecepatan menunjukkan seberapa cepat konten halaman terlihat terisi lengkap. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Indeks Kecepatan"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Pengalihan mencakup penundaan tambahan sebelum halaman dapat dimuat. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Hindari pengalihan lebih dari satu halaman"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Time To First Byte mengidentifikasi waktu saat server mengirim respons. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Dokumen root memerlukan waktu {timeInMs, number, milliseconds} md"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Mengurangi waktu respons server (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Waktu respons server sedikit (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Durasi"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nama"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Waktu Mulai"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Jenis"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Pertimbangkan melengkapi aplikasi dengan User Timing API untuk mengukur performa sebenarnya aplikasi Anda selama pengalaman pengguna utama. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 waktu pengguna}other{# waktu pengguna}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Tanda dan ukuran Waktu Pengguna"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Pertimbangkan menambahkan petunjuk menyambungkan terlebih dahulu atau mengambil terlebih dahulu dns resource untuk melakukan sambungan awal ke nama domain pihak ketiga yang penting. [Pelajari lebih lanjut](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Sambungkan terlebih dahulu ke nama domain yang diperlukan"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Pertimbangkan menggunakan <link rel=preload> untuk memprioritaskan pengambilan resource yang saat ini diminta selama pemuatan halaman. [Pelajari lebih lanjut](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Muat permintaan utama terlebih dahulu"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Informasi selengkapnya tentang performa aplikasi Anda."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostik"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Aspek terpenting dari performa adalah seberapa cepat piksel dirender di layar. Metrik utama: First Contentful Paint, First Meaningful Paint"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Penyempurnaan First Paint"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Pengoptimalan ini dapat mempercepat pemuatan halaman."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Peluang"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metrik"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Menyempurnakan pengalaman pemuatan halaman keseluruhan, sehingga halaman responsif dan siap untuk digunakan secepatnya. Metrik utama: Waktu untuk Interaktif, Indeks Kecepatan"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Penyempurnaan Keseluruhan"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Performa"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL Cache"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Ukuran (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Waktu yang Dihabiskan"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potensi Penghematan (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potensi Penghematan (md)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potensi penghematan {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potensi penghematan {wastedMs, number, milliseconds} md"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} md"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} d"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Tampilkan audit"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navigasi Awal"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latensi lokasi kritis maksimal:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Error!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Error laporan: tidak ada informasi audit"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Data Lab"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analisis halaman saat ini pada 3G teremulasi. Nilai adalah hasil perkiraan dan dapat bervariasi."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Item tambahan untuk diperiksa secara manual"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Tidak berlaku"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Peluang"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Perkiraan Penghematan"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Lulus audit"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Skala skor:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Ada masalah yang memengaruhi jalannya Lighthouse ini:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Nilai adalah hasil perkiraan dan dapat bervariasi."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Peringatan: "}};
+
+
+},{}],57:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Le estensioni di Chrome incidono negativamente sulle prestazioni di caricamento di questa pagina. Prova a controllare la pagina in modalità di navigazione in incognito o da un profilo Chrome senza estensioni."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Valutazione degli script"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Analisi script"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Totale"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Potresti ridurre i tempi di analisi, compilazione ed esecuzione di JS. A tale scopo potrebbe essere utile pubblicare payload JS di dimensioni inferiori. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Riduci il tempo di esecuzione di JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Tempo di esecuzione JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Le GIF di grandi dimensioni non sono efficaci per pubblicare contenuti animati. Anziché le GIF potresti usare video MPEG4/WebM per le animazioni e PNG/WebP per le immagini statiche. In questo modo userai meno byte di rete. [Ulteriori informazioni](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Usa formati video per i contenuti animati"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Potresti caricare in modo differito le immagini fuori schermo e nascoste al termine del caricamento di tutte le risorse fondamentali per ridurre il tempo necessario per la completa interattività. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Rimanda immagini fuori schermo"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Alcune risorse bloccano la prima visualizzazione della pagina. Potresti pubblicare le risorse JS/CSS fondamentali incorporate e rimandare tutte le risorse JS/styles non fondamentali. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Elimina le risorse di blocco della visualizzazione"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"I payload di rete di grandi dimensioni comportano costi reali per gli utenti e sono strettamente correlati a lunghi tempi di caricamento. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Dimensioni totali: {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Evita payload di rete enormi"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Vengono evitati payload di rete enormi"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Minimizza i file CSS per ridurre le dimensioni dei payload di rete. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minimizza CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Minimizza i file JavaScript per ridurre le dimensioni dei payload e i tempi di analisi degli script. [Ulteriori informazioni](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minimizza JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Rimuovi dai fogli di stile le regole inutilizzate per ridurre i byte superflui consumati dall'attività di rete. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Rimanda codice CSS inutilizzato"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Rimuovi il codice JavaScript inutilizzato per ridurre i byte consumati dall'attività di rete."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Rimuovi il codice JavaScript inutilizzato"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Una lunga durata della cache può velocizzare le visite abituali della tua pagina. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 risorsa trovata}other{# risorse trovate}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Pubblica le risorse statiche con criteri della cache efficaci"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Vengono usati criteri della cache efficaci per le risorse statiche"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Le immagini ottimizzate vengono caricate più velocemente e consumano meno traffico della rete dati. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Codifica in modo efficace le immagini"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Pubblica immagini di dimensioni adeguate per consumare meno traffico della rete dati e ridurre i tempi di caricamento. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Usa immagini di dimensioni adeguate"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Le risorse basate sul testo dovrebbero essere pubblicate con compressione (gzip, deflate o brotli) per ridurre al minimo il numero totale di byte di rete. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Attiva la compressione del testo"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"I formati delle immagini come JPEG 2000, JPEG XR e WebP spesso consentono una compressione migliore rispetto a quella dei formati PNG o JPEG, che comporta download più veloci e un minor consumo di dati. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Pubblica immagini in formati più recenti"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Nella sezione Catene di richieste fondamentali indicata di seguito vengono mostrate le risorse caricate con priorità elevata. Potresti ridurre la lunghezza delle catene e le dimensioni del download delle risorse oppure posticipare il download delle risorse non necessarie per migliorare il caricamento della pagina. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 catena trovata}other{# catene trovate}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Riduci al minimo la profondità delle richieste fondamentali"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Gli ingegneri che si occupano dei browser consigliano di usare meno di ~1500 nodi DOM per le pagine. L'ideale sarebbe una struttura ad albero con profondità di < 32 elementi e meno di 60 elementi secondari/principali. Un DOM di grandi dimensioni può aumentare l'utilizzo di memoria, causare [calcoli di stile] più lunghi (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) e generare costosi [adattamenti dinamici del layout](https://developers.google.com/speed/articles/reflow). [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 nodo}other{# nodi}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Evita di usare un DOM di dimensioni eccessive"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Profondità massima DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Nodi DOM totali"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Viene evitato un DOM di dimensioni eccessive"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Usa la funzione CSS font-display per assicurarti che il testo sia visibile agli utenti durante il caricamento dei caratteri web. [Ulteriori informazioni](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Assicurati che il testo rimanga visibile durante il caricamento dei caratteri web"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Tutto il testo rimane visibile durante il caricamento dei caratteri web"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Categoria"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Potresti ridurre i tempi di analisi, compilazione ed esecuzione di JS. A tale scopo potrebbe essere utile pubblicare payload JS di dimensioni inferiori."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Riduci al minimo il lavoro del thread principale"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Il lavoro del thread principale è ridotto al minimo"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"La valutazione in alto è una stima del tempo impiegato dall'app, espresso in millisecondi, per rispondere all'input dell'utente durante il periodo di 5 s più impegnativo del caricamento della pagina. Se la latenza è superiore a 50 ms, gli utenti potrebbero considerare lenta la tua app. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Latenza input stimata"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"La metrica Prima visualizzazione con contenuti indica il momento in cui vengono visualizzati il primo testo o la prima immagine. [Ulteriori informazioni] (https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Visualizzazione dei primi contenuti"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"La metrica Prima inattività CPU indica la prima volta in cui il thread principale della pagina è abbastanza tranquillo da poter gestire l'input. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Prima inattività CPU"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"La metrica Visualizzazione primi contenuti utili indica quando diventano visibili i contenuti principali di una pagina. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Visualizzazione primi contenuti utili"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"La metrica Tempo per interattività indica il momento in cui la pagina diventa completamente interattiva. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tempo per interattività"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"La metrica Indice velocità mostra la velocità con cui diventano visibili i contenuti di una pagina. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Indice velocità"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"I reindirizzamenti comportano ulteriori ritardi prima del caricamento della pagina. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Evita i reindirizzamenti tra più pagine"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"La metrica Tempo per primo byte identifica il momento in cui il server invia una risposta. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Il documento root ha richiesto {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Riduci i tempi di risposta del server (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"I tempi di risposta del server sono brevi (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Durata"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nome"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Inizio"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tipo"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Potresti dotare la tua app dell'API User Timing per misurare le prestazioni reali durante le esperienze utente chiave. [Ulteriori informazioni] (https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 tempo utente}other{# tempi utente}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Indicatori e misure User Timing"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Potresti aggiungere hint di precollegamento o prelettura DNS delle risorse per collegarti anticipatamente a importanti origini di terze parti. [Ulteriori informazioni](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Precollegati alle origini necessarie"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Potresti usare <link rel=preload> per dare la priorità al recupero delle risorse attualmente richieste in un secondo momento nel caricamento della pagina. [Ulteriori informazioni](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Precarica le richieste fondamentali"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Ulteriori informazioni sulle prestazioni della tua applicazione."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostica"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"L'aspetto più importante delle prestazioni è la velocità di visualizzazione dei pixel sullo schermo. Metriche chiave: Visualizzazione dei primi contenuti, Visualizzazione primi contenuti utili"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Miglioramenti della prima visualizzazione"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Queste ottimizzazioni possono velocizzare il caricamento della pagina."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Opportunità"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metriche"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Migliora l'esperienza di caricamento generale per fare in modo che la pagina diventi reattiva e pronta all'uso nel più breve tempo possibile. Metriche chiave: Tempo per interattività, Indice velocità"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Miglioramenti generali"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Prestazioni"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL cache"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Dimensioni (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Tempo trascorso"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potenziali risparmi (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potenziali risparmi (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potenziali risparmi di {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potenziali risparmi di {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Mostra controlli"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navigazione iniziale"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latenza massima del percorso critico:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Errore"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Errore segnalato: nessuna informazione sul controllo"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Dati di prova controllati"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse] (https://developers.google.com/web/tools/lighthouse/) analizza la pagina corrente su 3G emulato. I valori sono delle stime e potrebbero variare."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Ulteriori elementi da controllare manualmente"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Non applicabile"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Opportunità"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Risparmi stimati"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Controlli superati"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Scala di valutazione:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Si sono verificati dei problemi che incidono su questa esecuzione di Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"I valori sono delle stime e potrebbero variare."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Avvisi: "}};
+
+
+},{}],58:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome 拡張機能がこのページの読み込みに悪影響を及ぼしています。シークレット モードで、または拡張機能なしの Chrome プロファイルからページを監査してみてください。"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"スクリプトの評価"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"スクリプトの解析"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"合計"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"JS の解析、コンパイル、実行にかかる時間の短縮をご検討ください。配信する JS ペイロードのサイズを抑えると効果が見込めます。[詳細](https://developers.google.com/web/tools/lighthouse/audits/bootup)"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"JavaScript の実行にかかる時間の低減"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript の実行にかかる時間"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"サイズの大きい GIF は、アニメーション コンテンツの配信方法として効率的ではありません。ネットワークの通信量を抑えるため、GIF を使用する代わりに、アニメーションには MPEG4/WebM 動画、静止画像には PNG/WebP を使用することをご検討ください。[詳細](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"アニメーション コンテンツでの動画フォーマットの使用"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"オフスクリーンの非表示の画像は、クリティカルなリソースをすべて読み込んだ後に遅れて読み込むようにして、インタラクティブになるまでの時間を短縮することをご検討ください。[Learn more](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"オフスクリーン画像の遅延読み込み"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"ページの初回ペイントをリソースが阻害しています。クリティカルな JS や CSS はインラインで配信し、それ以外の JS やスタイルはすべて遅らせることをご検討ください。[詳細](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"レンダリングを妨げるリソースの除外"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"ネットワーク ペイロードのサイズが大きいと、ユーザーの金銭的負担が大きくなり、多くの場合、読み込み時間が長くなります。[詳細](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"合計サイズは {totalBytes, number, bytes} KB でした"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"過大なネットワーク ペイロードの回避"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"過大なネットワーク ペイロードの回避"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"CSS ファイルを最小化すると、ネットワーク ペイロードのサイズを抑えることができます。[詳細](https://developers.google.com/web/tools/lighthouse/audits/minify-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"CSS の最小化"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"JavaScript ファイルを最小化すると、ペイロード サイズとスクリプトの解析時間を抑えることができます。[詳細](https://developers.google.com/speed/docs/insights/MinifyResources)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"JavaScript の最小化"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"使用していないルールをスタイルシートから削除して、データ通信量を減らしてください。[詳細](https://developers.google.com/web/tools/lighthouse/audits/unused-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"使用していない CSS の遅延読み込み"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"使用していない JavaScript を削除して、データ通信量を減らしてください。"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"使用していない JavaScript の削除"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"キャッシュの有効期間を長くすると、再訪問したユーザーへのページの読み込み速度を向上できます。[詳細](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 件のリソースが見つかりました}other{# 件のリソースが見つかりました}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"静的なアセットと効率的なキャッシュ ポリシーの配信"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"静的なアセットでの効率的なキャッシュ ポリシーの使用"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"画像を最適化すると、読み込み時間を速くして、モバイルデータ量を抑えることができます。[詳細](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"効率的な画像フォーマット"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"適切なサイズの画像を配信して、モバイルデータ量と読み込み時間を抑えてください。[詳細](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"適切なサイズの画像"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"テキストベースのリソースは圧縮(gzip、deflate、または brotli)して配信し、ネットワークの全体的な通信量を最小限に抑えてください。[詳細](https://developers.google.com/web/tools/lighthouse/audits/text-compression)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"テキスト圧縮の有効化"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000、JPEG XR、WebP などの画像フォーマットは、PNG や JPEG より圧縮性能が高く、ダウンロード時間やデータ使用量を抑えることができます。[詳細](https://developers.google.com/web/tools/lighthouse/audits/webp)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"次世代フォーマットでの画像の配信"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"下のクリティカル リクエスト チェーンでは、高い優先度で読み込まれたリソースを確認できます。チェーンの長さを縮小する、リソースのダウンロード サイズを抑える、不要なリソースのダウンロードを遅らせるなどしてページの読み込み速度を改善することをご検討ください。[詳細](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)"},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 件のチェーンが見つかりました}other{# 件のチェーンが見つかりました}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"クリティカルなリクエストの深さの最小化"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"ブラウザ エンジニアは、ページに含まれる DOM のノード数が 1,500 個を超えないようにすることを推奨しています。ツリーの深さは 32 要素まで、子や親の要素数は 60 個までにするのが最適です。DOM サイズが大きいと、メモリの使用量が増え、[スタイルの計算](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations)に時間がかかり、[レイアウトのリフロー](https://developers.google.com/speed/articles/reflow)というコストが発生します。[詳細](https://developers.google.com/web/tools/lighthouse/audits/dom-size)"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 個のノード}other{# 個のノード}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"過大な DOM サイズの回避"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"DOM の最大深さ"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"合計 DOM ノード数"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"過大な DOM サイズの回避"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"フォント表示の CSS 機能を使用して、ウェブフォントの読み込み中にユーザーがテキストを見られるようにしてください。[詳細](https://developers.google.com/web/updates/2016/02/font-display)"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"ウェブフォント読み込み中のテキストの表示"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"ウェブフォント読み込み中の全テキストの表示"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"カテゴリ"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"JS の解析、コンパイル、実行にかかる時間の短縮をご検討ください。配信する JS ペイロードのサイズを抑えると効果が見込めます。"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"メインスレッド処理の最小化"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"メインスレッド処理の最小化"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"上のスコアは、ページ読み込みの最もビジーな 5 秒間における、ユーザーの入力に対するアプリの応答時間(ミリ秒)です。待ち時間が 50 ミリ秒より長い場合、アプリの反応が悪いと思われる可能性があります。[詳細](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"入力の推定待ち時間"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"コンテンツの初回ペイントは、テキストまたは画像が初めてペイントされるまでにかかった時間です。[詳細](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"コンテンツの初回ペイント"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"CPU の初回アイドルは、ページのメインスレッド処理が静止し、初めて入力の処理が可能になるまでにかかった時間です。[詳細](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU の初回アイドル"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"意味のあるコンテンツの初回ペイントは、ページの主要なコンテンツが可視化されるまでにかかった時間です。[詳細](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"意味のあるコンテンツの初回ペイント"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"ページが完全にインタラクティブになるまでの時間です。[詳細](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"インタラクティブになるまでの時間"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"速度インデックスは、ページのコンテンツが取り込まれて表示される速さを表します。[詳細](https://developers.google.com/web/tools/lighthouse/audits/speed-index)"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"速度インデックス"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"リダイレクトを行うと、ページの読み込みにさらに時間がかかる可能性があります。[詳細](https://developers.google.com/web/tools/lighthouse/audits/redirects)"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"複数のページ リダイレクトの回避"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"最初の 1 バイトまでの時間は、サーバーが応答を返すまでにかかった時間を表しています。[詳細](https://developers.google.com/web/tools/lighthouse/audits/ttfb)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"ルート ドキュメントの読み込みに {timeInMs, number, milliseconds} ミリ秒かかりました"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"サーバー応答時間の短縮(TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"サーバーの応答時間が遅い(TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"継続時間"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"名前"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"開始時間"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"タイプ"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"User Timing API を使用してアプリをインストルメント化し、主要なユーザー エクスペリエンスでのアプリの実際のパフォーマンスを測定できるようにしてください。[詳細](https://developers.google.com/web/tools/lighthouse/audits/user-timing)"},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 件のカスタム速度}other{# 件のカスタム速度}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"カスタム速度の記録と計測"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"事前接続または DNS プリフェッチのリソースヒントを追加して、重要な第三者ドメインへの接続を早期に確立できるようにすることをご検討ください。[詳細](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"必須のドメインへの事前接続"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"<link rel=preload> を使用して、現在ページ読み込みの後のほうでリクエストしているリソースを優先的に取得することをご検討ください。[詳細](https://developers.google.com/web/tools/lighthouse/audits/preload)"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"キー リクエストのプリロード"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"アプリケーションのパフォーマンスに関する詳細。"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"診断"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"パフォーマンスの最も重要な点は、ピクセルをどのくらい速く画面にレンダリングできるかです。主要な指標: コンテンツの初回ペイント、意味のあるコンテンツの初回ペイント"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"初回ペイントの改善点"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"これらの項目を改善すると、ページの読み込み時間を短縮できます。"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"改善できる項目"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"指標"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"読み込みの全体的なパフォーマンスを改善して、ページの反応性や操作性を高めましょう。主要な指標: インタラクティブになるまでの時間、速度インデックス"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"全体的な改善点"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"パフォーマンス"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"キャッシュの TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"サイズ(KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"かかった時間"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"減らせるデータ量(KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"短縮できる時間(ミリ秒)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"{wastedBytes, number, bytes} KB 減らせます"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"{wastedMs, number, milliseconds} ミリ秒短縮できます"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ミリ秒"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} 秒"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"監査を表示"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"最初の移動先"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"クリティカル パスの最大待ち時間:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"エラー"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"レポートエラー: 監査情報はありません"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"ラボデータ"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"エミュレート済み 3G での現在のページに関する [Lighthouse](https://developers.google.com/web/tools/lighthouse/) 分析です。推定値のため変動する可能性があります。"},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"個別の検証が必要な他の項目"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"該当なし"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"改善できる項目"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"短縮できる時間(推定)"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"合格した監査"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"スコア評価:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Lighthouse の実行に影響する問題が発生しました。"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"推定値のため変動する可能性があります。"},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"警告: "}};
+
+
+},{}],59:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome 확장 프로그램이 이 페이지의 로드 성능에 부정적인 영향을 미쳤습니다. 시크릿 모드나 확장 프로그램이 없는 Chrome 프로필에서 페이지를 검사해 보세요."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"스크립트 평가"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"스크립트 파싱"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"합계"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"JS 파싱, 컴파일, 실행에 소요되는 시간을 줄이세요. 용량이 적은 JS 페이로드를 제공하는 것이 도움이 될 수 있습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/bootup)"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"자바스크립트 실행 시간 단축"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"자바스크립트 실행 시간"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"대용량 GIF는 애니메이션 콘텐츠를 전달하는 데 비효율적입니다. 애니메이션에는 MPEG4/WebM 동영상을, 정적인 이미지에는 PNG/WebP를 GIF 대신 사용하여 네트워크 바이트를 절약하세요. [자세히 알아보기](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"애니메이션 콘텐츠에 동영상 형식 사용하기"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"중요한 리소스의 로드가 모두 완료된 후에는 오프스크린 및 숨겨진 이미지를 지연 로드함으로써 상호작용 시간을 줄이는 것이 좋습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"오프스크린 이미지 지연하기"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"리소스가 페이지의 첫 번째 페인트를 차단하고 있습니다. 중요한 JS/CSS를 인라인으로 전달하고 중요하지 않은 모든 JS/style을 지연하는 것이 좋습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"렌더링 차단 리소스 제거하기"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"네트워크 페이로드가 커지면 사용자에게 실제 비용 부담이 되며 로드 시간이 길어질 수 있습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"총 크기: {totalBytes, number, bytes}KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"네트워크 페이로드가 커지지 않도록 관리하기"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"대규모 네트워크 페이로드 방지하기"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"CSS 파일을 축소하면 네트워크 페이로드의 크기가 줄어들 수 있습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/minify-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"CSS 축소하기"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"자바스크립트 파일을 줄이면 페이로드 크기 및 스크립트 파싱 시간이 줄어들 수 있습니다. [자세히 알아보기](https://developers.google.com/speed/docs/insights/MinifyResources)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"자바스크립트 줄이기"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"스타일시트에서 사용되지 않는 규칙을 삭제하여 네트워크 활동에 불필요하게 소비되는 바이트를 줄이세요. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/unused-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"사용하지 않는 CSS 지연하기"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"사용하지 않는 자바스크립트를 삭제하고 네트워크 활동에 소비되는 바이트를 줄이세요."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"사용하지 않는 자바스크립트 삭제하기"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"캐시 수명이 길면 페이지를 반복해서 방문하는 속도가 빨라질 수 있습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{리소스 1개 발견됨}other{리소스 #개 발견됨}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"효율적인 캐시 정책을 사용하여 정적인 애셋 제공하기"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"정적인 애셋에 효율적인 캐시 정책 사용하기"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"최적화된 이미지는 빨리 로드되며 모바일 데이터를 적게 소비합니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"효율적으로 이미지 인코딩하기"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"알맞은 크기의 이미지를 게재하여 모바일 데이터를 절약하고 로드 시간을 단축하세요. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"이미지 크기 적절하게 설정하기"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"총 네트워크 바이트를 최소화하려면 텍스트 기반 리소스를 압축(gzip, deflate, brotli)하여 제공해야 합니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/text-compression)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"텍스트 압축 사용"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000, JPEG XR, WebP와 같은 이미지 형식을 사용하면 PNG 또는 JPEG보다 압축률이 높기 때문에 다운로드 속도가 빠르고 데이터 소비량도 줄어듭니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/webp)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"차세대 형식을 사용해 이미지 제공하기"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"다음의 크리티컬 요청 체인(Critical Request Chains)은 로드 시 우선순위가 높은 리소스를 보여줍니다. 체인의 길이를 줄이고, 리소스의 다운로드 크기를 줄이거나 불필요한 리소스의 다운로드를 지연하여 페이지 로드 속도를 높이는 것이 좋습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1개 체인 발견됨}other{#개 체인 발견됨}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"중요 요청 깊이 최소화하기"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"브라우저 엔지니어들은 페이지에 포함된 DOM 노드의 수가 1,500개 미만인 것이 바람직하다고 말합니다. 최적의 값은 트리 깊이가 요소 32개 미만이고 하위/상위 요소 60개 미만일 때입니다. DOM이 크면 메모리 사용량이 늘어나고 [스타일 계산](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) 시간이 길어질 수 있으며, 큰 비용이 드는 [레이아웃 리플로](https://developers.google.com/speed/articles/reflow)가 발생할 수 있습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/dom-size)"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{노드 1개}other{노드 #개}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"과도한 DOM 크기 지양하기"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"최대 DOM 깊이"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"총 DOM 노드"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"과도한 DOM 크기 지양하기"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"웹폰트가 로드되는 동안 사용자에게 텍스트가 표시되도록 글꼴 표시 CSS 기능을 사용하세요. [자세히 알아보기](https://developers.google.com/web/updates/2016/02/font-display)"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"웹폰트가 로드되는 동안 텍스트가 계속 표시되는지 확인하기"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"웹폰트가 로드되는 동안 모든 텍스트가 계속 표시됩니다"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"카테고리"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"JS 파싱, 컴파일, 실행에 소요되는 시간을 줄이세요. 용량이 적은 JS 페이로드를 제공하면 도움이 될 수 있습니다."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"기본 스레드 작업 최소화하기"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"기본 스레드 작업 최소화하기"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"위의 점수는 페이지 로드가 가장 많은 5초 동안 앱이 사용자 입력에 응답하는 데 걸리는 시간(ms)의 추정치입니다. 지연 시간이 50ms보다 길면 사용자가 앱이 느리다고 인식할 수 있습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"예상 입력 대기시간"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"콘텐츠가 포함된 첫 페인트는 첫 번째 텍스트 또는 이미지가 표시되는 시간을 나타냅니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"최초 만족 페인트"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"최초 CPU 유휴 상태는 페이지의 기본 스레드가 입력을 처리할 수 있을 만큼 조용한 상태가 된 첫 번째 시간을 표시합니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"최초 CPU 유휴 상태"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"최초 유의미 페인트는 페이지의 기본 콘텐츠가 표시되는 경우를 측정합니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"최초 유의미 페인트"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"상호작용은 페이지가 완전히 상호작용하는 시간을 표시합니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"상호작용 시간"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"속도 색인은 페이지 콘텐츠가 얼마나 빨리 표시되는지 보여줍니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/speed-index)"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"속도 색인"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"리디렉션을 사용하면 페이지가 로드되기 전 추가적인 지연이 발생합니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/redirects)"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"여러 차례의 페이지 리디렉션 피하기"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Time To First Byte는 서버가 응답을 보내는 시간을 식별합니다. [자세히 알아보기] (https://developers.google.com/web/tools/lighthouse/audits/ttfb)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"루트 문서에 {timeInMs, number, milliseconds}ms 소요됨"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"서버 응답 시간(TTFB) 단축"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"서버 응답 시간 낮음(TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"시간"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"이름"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"시작 시간"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"유형"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"앱에 User Timing API를 사용하여 중요 사용자 경험이 이루어지는 동안의 실적을 측정하세요. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{사용자 시간 1회}other{사용자 시간 #회}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"사용자 타이밍 표시 및 측정 값"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"사전 연결 또는 DNS 프리페치 리소스 힌트를 추가하여 중요한 타사 원본에 대한 조기 연결을 수립하는 것이 좋습니다. [자세히 알아보기](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"필수 원본 미리 연결하기"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"<link rel=preload>를 사용하여 페이지 로드에서 현재 나중에 요청되는 리소스를 가져오는 데 우선순위를 두는 것이 좋습니다. [자세히 알아보기](https://developers.google.com/web/tools/lighthouse/audits/preload)"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"중요한 요청을 미리 로드하기"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"애플리케이션 성능 관련 추가 정보"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"진단"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"성능에서 가장 중요한 측면은 픽셀이 화면에 렌더링되는 속도입니다. 주요 측정항목: 최초 만족 페인트, 최초 유의미 페인트"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"최초 페인트 개선"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"다음의 최적화 방법을 사용하면 페이지 로드 속도를 높일 수 있습니다."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"추천"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"측정항목"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"페이지가 빠르게 반응하고 가능한 한 빨리 사용할 수 있는 준비가 되도록 전반적인 로드 환경을 강화하세요. 주요 측정항목: 상호작용 시간, 속도 색인"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"전반적인 개선사항"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"성능"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"캐시 TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"크기(KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"소요 시간"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"절감 가능치(KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"절감 가능한 페이지 로드 시간(ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"절감 가능치: {wastedBytes, number, bytes}KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"절감 가능 {wastedMs, number, milliseconds}ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds}ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds}초"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"감사 보기"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"초기 탐색"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"최상 경로 최대 지연 시간:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"오류!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"보고 오류: 감사 정보 없음"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"실험실 데이터"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"에뮬레이트된 3G 환경에서의 현재 페이지 [Lighthouse](https://developers.google.com/web/tools/lighthouse/) 분석 결과입니다. 값은 추정치이며 달라질 수 있습니다."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"직접 확인해야 하는 추가 항목"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"해당 사항 없음"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"추천"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"예상 절감치"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"통과한 감사"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"점수 척도:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Lighthouse 실행에 영향을 미치는 문제가 발생했습니다."},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"값은 추정치이며 달라질 수 있습니다."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"경고: "}};
+
+
+},{}],60:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"„Chrome“ plėtiniai neigiamai paveikė šio puslapio įkėlimo našumą. Pabandykite patikrinti puslapį inkognito režimu arba naudodami „Chrome“ profilį be plėtinių."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Scenarijaus įvertinimas"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Scenarijaus analizė"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Iš viso"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Apsvarstykite, ar neverta sutrumpinti JS analizei, kompiliavimui ir vykdymui skiriamo laiko. Mažesnės JS naudingosios apkrovos gali padėti tai padaryti. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Sutrumpinkite „JavaScript“ vykdymo laiką"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"„JavaScript“ vykdymo laikas"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Dideli GIF failai nėra efektyvus animuoto turinio pateikimo būdas. Vietoje GIF galite naudoti MPEG4 ar „WebM“ vaizdo įrašų animacijai ir PNG ar „WebP“ statiniams vaizdams pateikti, kad sutaupytumėte tinklo baitų. [Sužinokite daugiau](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Naudokite vaizdo įrašo formatus animuotam turiniui pateikti"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Galbūt verta įkelti ne ekraninius ir paslėptus vaizdus tik tada, kai bus įkelti visi svarbiausi ištekliai, kad sutrumpėtų laikas iki sąveikos. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Atidėkite ne ekraninius vaizdus"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Ištekliai blokuoja pirmąjį puslapio parodymą. Galbūt verta pateikti svarbiausius JS ar CSS kaip eilutinius elementus ir atidėti visus nesvarbius JS ar stilius. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Pašalinkite pateikimą blokuojančius išteklius"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Dėl didelių tinklo naudingųjų apkrovų naudotojai praranda pinigus ir jos glaudžiai susijusios su ilgu įkėlimo laiku. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Bendras dydis: {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Išvenkite didelių tinklo naudingųjų apkrovų"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Išvengiama didelių tinklo naudingųjų apkrovų"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Sumažinus CSS failų dydį, gali sumažėti tinklo naudingosios apkrovos. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Sumažinkite CSS failus"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Sumažinus „JavaScript“ failus, galima sumažinti naudingąsias apkrovas ir sutrumpinti scenarijaus analizavimo laiką. [Sužinokite daugiau](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Sumažinkite „JavaScript“"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Pašalinkite nenaudojamas taisykles iš stiliaus failų, kad tinklo veikla sunaudotų mažiau nereikalingų baitų. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Atidėkite nenaudojamus CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Pašalinkite nenaudojamą „JavaScript“, kad tinklo veikla sunaudotų mažiau baitų."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Pašalinkite nenaudojamą „JavaScript“"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Jei talpykla galios ilgiau, pakartotiniai apsilankymai puslapyje gali pagreitėti. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Rastas 1 išteklius}one{Rastas # išteklius}few{Rasti # ištekliai}many{Rasta # ištekliaus}other{Rasta # išteklių}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Statiniams ištekliams taikykite efektyvią talpyklos politiką"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Naudojama efektyvi statinių išteklių talpyklos politika"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimizuoti vaizdai įkeliami greičiau ir sunaudoja mažiau mobiliojo ryšio duomenų. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Efektyviai koduokite vaizdus"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Teikite tinkamo dydžio vaizdus, kad būtų taupomi mobiliojo ryšio duomenys ir puslapis būtų įkeliamas greičiau. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Pasirinkite tinkamo dydžio vaizdus"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Tekstinius išteklius reikėtų suglaudinti (Naudojant „Gzip“, „Deflate“ arba „Brotli“), kad bendrai būtų sunaudojama kuo mažiau tinklo baitų. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Įgalinkite teksto glaudinimą"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Tokių formatų kaip JPEG 2000, JPEG XR ir „WebP“ vaizdai dažniausiai glaudinami geriau nei PNG ar JPEG vaizdai, todėl yra atsisiunčiami greičiau ir sunaudoja mažiau duomenų. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Pateikite naujos kartos formatų vaizdus"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Toliau pateiktose svarbiausių užklausų grandinėse nurodoma, kurie ištekliai įkelti nurodant aukštą prioritetą. Kad puslapio įkėlimas būtų sklandesnis, galbūt verta sutrumpinti grandines, sumažinti atsisiunčiamų išteklių dydį arba atidėti nereikalingų išteklių atsisiuntimą. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Rasta 1 grandinė}one{Rasta # grandinė}few{Rastos # grandinės}many{Rasta # grandinės}other{Rasta # grandinių}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Sumažinkite svarbiausių užklausų gylį"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Naršyklių inžinieriai rekomenduoja puslapiuose turėti ne daugiau nei apytiksliai 1,5 tūkst. DOM mazgų. Optimaliausias medžio gylis – mažiau nei 32 elementai ir mažiau nei 60 poelemenčių bei viršelemenčių. Dėl didelio DOM gali būti sunaudojama daugiau atminties, ilgiau skaičiuojami stiliai (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) ir reikia brangių išdėstymo perskaičiavimų (https://developers.google.com/speed/articles/reflow). [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 mazgas}one{# mazgas}few{# mazgai}many{# mazgo}other{# mazgų}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Venkite per didelių DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksimalus DOM gylis"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Bendras DOM mazgų skaičius"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Išvengiama per didelių DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Pasinaudokite šriftų pateikimo CSS funkcija, kad tekstas būtų matomas naudotojui, kol įkeliami žiniatinklio šriftai. [Sužinokite daugiau](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Užtikrinkite, kad įkeliant žiniatinklio šriftą būtų matomas tekstas"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Įkeliant žiniatinklio šriftą matomas visas tekstas"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorija"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Apsvarstykite, ar neverta sutrumpinti JS analizei, kompiliavimui ir vykdymui skiriamo laiko. Mažesnės JS naudingosios apkrovos gali padėti tai padaryti."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Pagrindinės grupės veikimo sutrumpinimas"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Sutrumpinamas pagrindinės grupės veikimas"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Toliau nurodytas rezultatas yra įvertintas laikas milisekundėmis, per kurį programa atsako į naudotojo įvestį per labiausiai užimtas puslapio įkėlimo 5 sekundes. Jei delsa ilgesnė nei 50 ms, naudotojams gali pasirodyti, kad programa veikia lėtai. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Įvertinta įvesties delsa"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Pirmas turiningas žymėjimas nurodo laiką, kada pažymimas pirmasis tekstas ar vaizdas. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Pirmasis „Contentful“ parodymas"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Pirmas cent. procesoriaus laisvas laikas nurodo pirmą laiką, kai pagrindinė puslapio grupė buvo pakankamai neaktyvi, kad galėtų apdoroti įvestį. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Pirmas cent. procesoriaus laisvas laikas"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Pirmasis reikšmingas parodymas nurodo, kada parodomas pagrindinis puslapio turinys. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Pirmasis reikšmingas parodymas"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Sąveika nurodo laiką, per kurį puslapis tampa visiškai sąveikus. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Laikas iki sąveikos"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Greičio rodiklis parodo, kaip greitai pavaizduojamas puslapio turinys. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Greičio rodiklis"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Peradresuojant puslapio įkėlimas dar labiau delsia. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Venkite kelių puslapio peradresavimų"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Laikas iki pirmojo baito nurodo laiką, per kurį serveris atsako. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Šakninio dokumento įkėlimas užtruko {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Serverio atsako laiko sutrumpinimas (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Serverio atsako laikas yra trumpas (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Trukmė"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Pavadinimas"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Pradžios laikas"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tipas"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Galbūt verta apdoroti programą naudojant naudotojo laiko API ir įvertinti programos realų našumą atsižvelgiant į pagrindines naudotojo funkcijas. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 naudotojo laikas}one{# naudotojo laikas}few{# naudotojo laikai}many{# naudotojo laiko}other{# naudotojo laikų}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Naudotojo laiko žymės ir matavimas"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Galbūt verta pridėti išankstinio prijungimo arba DNS išankstinės iškvietos ištekliaus nurodymus, kad ryšys su svarbiais trečiųjų šalių šaltiniais būtų užmezgamas iš anksto. [Sužinokite daugiau](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Iš anksto prisijunkite prie reikiamų šaltinių"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Galbūt verta naudoti <link rel=preload> ir suteikti prioritetą gaunamiems ištekliams, kurių užklausos šiuo metu teikiamos vėliau įkeliant puslapį. [Sužinokite daugiau](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Iš anksto įkelkite svarbiausias užklausas"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Daugiau informacijos apie jūsų programos našumą."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Svarbiausias našumo rodiklis – kaip greitai taškai pateikiami ekrane. Svarbiausia metrika: pirmasis „Contentful“ parodymas, pirmasis reikšmingas parodymas"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Pirmojo parodymo patobulinimai"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Toks optimizavimas gali padėti pagreitinti puslapio įkėlimą."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Galimybės"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metrika"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Pagerinkite bendrą įkėlimo našumą, kad puslapis reaguotų ir būtų parengtas naudoti kuo greičiau. Svarbiausia metrika: laikas iki sąveikos, greičio rodiklis"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Bendri patobulinimai"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Našumas"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Talpyklos TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Dydis (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Sugaištas laikas"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Galima sutaupyti (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Galima sutaupyti (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Galima sutaupyti {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Galima sutaupyti {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} sek."},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Rodyti patikras"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Pradinis naršymas"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Didžiausia svarbiausio kelio delsa:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Klaida!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Ataskaitos klaida: nėra patikros informacijos"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboratorijos duomenys"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Dabartinio puslapio [„Lighthouse“](https://developers.google.com/web/tools/lighthouse/) analizė naudojant emuliuotą 3G. Vertės yra numatytos ir gali skirtis."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Papildomi elementai, kuriuos reikia patikrinti neautomatiškai"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Netaikoma"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Galimybė"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Numatomos santaupos"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Sėkmingos patikros"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Rezultatų skalė:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Paleidžiant „Lighthouse“ kilo problemų."},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Vertės yra numatytos ir gali skirtis."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Įspėjimai: "}};
+
+
+},{}],61:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome paplašinājumi negatīvi ietekmē šīs lapas ielādes veiktspēju. Mēģiniet lapas pārbaudi veikt inkognito režīmā vai no Chrome profila bez paplašinājumiem."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Skripta novērtēšana"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Skriptu parsēšana"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Kopā"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Ieteicams samazināt laiku, kas tiek izmantots JS parsēšanai, kompilēšanai un izpildei. Iespējams, konstatēsiet, ka ir noderīgi izmantot mazākas JS lietderīgās slodzes. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"JavaScript izpildes laika samazināšana"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript izpildes laiks"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Lieli GIF attēli nav efektīvi animēta satura rādīšanai. Animācijām ir ieteicams izmantot MPEG4/WebM video, bet statiskiem attēliem — PNG/WebP, nevis GIF, lai samazinātu tīkla lietojumu (baitos). [Uzzināt] vairāk(https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Izmantojiet video failu formātus animētam saturam"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Lai samazinātu laiku līdz interaktivitātei, ārpus ekrāna un paslēptos attēlus ar lēnu ielādi ieteicams atlikt līdz visu svarīgo resursu ielādes pabeigšanai. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Ārpus ekrāna esošo attēlu atlikšana"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resursi bloķē jūsu lapas pirmo satura atveidojumu. Ieteicams rādīt svarīgos JS/CSS iekļautā veidā un atteikties no visiem nesvarīgajiem JS/stiliem. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Samaziniet resursus, kas bloķē renderēšanu"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Lielas tīkla lietderīgās slodzes izmaksā lietotājiem īstu naudu un ir cieša saistītas ar ilgu ielādes laiku. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Kopējais lielums bija {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Pārāk lielas tīkla lietderīgās slodzes nepieļaušana"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Nepieļauj pārāk lielu tīkla lietderīgo slodzi"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Samazinot CSS failus, var samazināties tīkla lietderīgā slodze. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Samaziniet CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Samazinot JavaScript failus, var samazināties lietderīgās slodzes apjomi un skriptu parsēšanas laiks. [Uzzināt vairāk](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"JavaScript·samazināšana"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Noņemiet no stila lapām neizmantotās kārtulas, lai samazinātu tīkla aktivitātei nevajadzīgo baitu izmantošanu. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Atlieciet neizmantoto CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Noņemiet neizmantoto JavaScript, lai samazinātu tīkla aktivitātes izmantoto baitu apjomu."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Noņemiet neizmantoto JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Iestatot ilgu kešatmiņas mūžu, lapas atkārtoti apmeklējumi varētu paātrināties. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Atrasts 1 resurss}zero{Atrasti # resursi}one{Atrasts # resurss}other{Atrasti # resursi}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Statisko elementu noteikšana, izmantojot efektīvu kešatmiņas politiku"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Efektīvas kešatmiņas politikas izmantošana statiskiem elementiem"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimizēti attēli tiek ielādēti ātrāk un izmanto mazāku mobilo datu apjomu. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Efektīva attēlu kodēšana"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Rādiet atbilstoša izmēra attēlus, lai tiktu izmantots mazāks mobilo datu apjoms un tiktu uzlabots ielādes laiks. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Atbilstoša lieluma attēli"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Lai samazinātu kopējo tīkla lietojumu (baitos), iesakām izmantot saspiešanu (Gzip, Deflate or Brotli). [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Iespējojiet teksta saspiešanu"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Tādi attēlu formāti kā JPEG 2000, JPEG XR un WebP bieži ir veiksmīgāk saspiežami nekā PNG vai JPEG — tas nozīmē ātrāku lejupielādi un mazāku datu patēriņu. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Rādiet attēlus nākamās paaudzes formātos"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Metrika “Kritisko pieprasījumu ķēdes” tālāk parāda, kuri resursi ir ielādēti ar augstāko prioritāti. Lai uzlabotu lapas ielādi, ieteicams samazināt ķēžu garumu, samazināt resursu lejupielādes apjomu vai atlikt nevajadzīgo resursu lejupielādi.[Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Atrasta 1 ķēde}zero{Atrastas # ķēdes}one{Atrasta # ķēde}other{Atrastas # ķēdes}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Kritisko pieprasījumu dziļuma samazināšana"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Pārlūka inženieri iesaka, lai lapā nebūtu vairāk par 1500 DOM mezgliem. Ieteicams, lai koka dziļums nepārsniegtu 32 elementus un 60 bērnelementus/vecākelementus. Liels DOM var palielināt atmiņas lietojumu, izraisīt ilgākus [stila aprēķinus](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) un radīt dārgu [izkārtojuma plūduma sakārtošanu](https://developers.google.com/speed/articles/reflow). [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 mezgls}zero{# mezglu}one{# mezgls}other{# mezgli}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Pārāk lielu DOM izmēru nepieļaušana"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksimālais DOM dziļums"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"DOM mezglu kopskaits"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Nepieļauj pārāk lielus DOM izmērus"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Izmantojiet fonta rādīšanas CSS funkciju, lai nodrošinātu, ka lietotāji tīmekļa fontu ielādes laikā var redzēt tekstu. [Uzzināt vairāk](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Visa teksta redzamības nodrošināšana tīmekļa fonta ielādes laikā"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Tīmekļa fonta ielādes laikā viss teksts paliek redzams"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorija"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Ieteicams samazināt laiku, kas tiek izmantots JS parsēšanai, kompilēšanai un izpildei. Iespējams, konstatēsiet, ka ir noderīgi izmantot mazākas JS lietderīgās slodzes."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Samaziniet galvenā pavediena darbu"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Galvenā pavediena darba samazināšana"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Iepriekš redzamais rādītājs aptuveni norāda, pēc cik ilga laika (milisekundēs) uz lietotāja ievadi reaģēs jūsu lietotne aizņemtākajā lapas ielādes 5 s periodā. Ja latentums pārsniedz 50 ms, iespējams, lietotāji jūsu lietotnes saņems novēloti. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Paredzētais ievades latentums"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Metrika \"Pirmais satura marķējums\" atzīmē laiku, kad tiek marķēts pirmais teksts vai attēls. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Pirmais saturīgais satura atveidojums"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Metrika “Pirmā CPU dīkstāve” norāda laiku, kad lapas galvenais pavediens ir kļuvis pietiekami mazs, lai varētu apstrādāt ievadi. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Pirmā CPU dīkstāve"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Metrika “Pirmais nozīmīgais satura atveidojums” norāda, kad kļūst redzams lapas galvenais saturs. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Pirmais nozīmīgais satura atveidojums"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interaktivitātes metrika norāda laiku, kad lapa ir pilnībā interaktīva. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Laiks līdz interaktivitātei"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Metrika “Ātruma rādītājs” norāda, cik ātri tiek parādīts lapas saturs. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Ātruma rādītājs"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Novirzīšana rada papildu aizkaves pirms lapas ielādes. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Nepieļaujiet vairākas lapas novirzīšanas"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Metrika “Laiks līdz pirmajam baitam” norāda laiku, kad jūsu serveris nosūta atbildi. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Saknes dokumentam nepieciešamais laiks: {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Servera atbildes laika samazināšana (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Servera atbildes laiks ir mazs (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Ilgums"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Vārds"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Sākuma laiks"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Veids"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Ieteicams pievienot lietotnei Lietotāju laika API, lai noteiktu lietotnes aktuālo veiktspēju lietotāju pamata darbības laikā. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 lietotāja laiks}zero{# lietotāju laiks}one{# lietotāja laiks}other{# lietotāju laiks}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Lietotāju laika atzīmes un mērījumi"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Ieteicams pievienot iepriekš pieslēgtu vai DNS sākotnējo datu iegūšanas resursa norādes, lai izveidotu laicīgus savienojumus ar svarīgiem trešās puses sākumpunktiem. [Uzzināt vairāk](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Veiciet iepriekšēju pieslēgšanu obligātajiem sākumpunktiem"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Ieteicams izmantot <link rel=preload>, lai noteiktu prioritāti tādu resursu iegūšanai, kas pašlaik lapas ielādē tiek pieprasīti vēlāk. [Uzzināt vairāk](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Veiciet svarīgāko pieprasījumu iepriekšēju ielādi"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Plašāka informācija par jūsu lietojumprogrammas veiktspēju"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Vissvarīgākais veiktspējas aspekts ir pikseļu renderēšanas ātrums ekrānā. Galvenās metrikas: “Pirmais saturīgais satura atveidojums”, “Pirmais nozīmīgais satura atveidojums”"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Pirmā satura atveidojuma uzlabojumi"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Šīs optimizācijas var paātrināt lapas ielādi."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Iespējas"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metrikas"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Uzlabojiet vispārējo ielādes darbību, lai lapa reaģētu un būtu gatava izmantošanai pēc iespējas ātrāk. Galvenās metrikas: “Laiks līdz interaktivitātei”, “Ātruma rādītājs”"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Vispārēji uzlabojumi"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Veiktspēja"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Kešatmiņas TTL vērtība"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Lielums (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Iztērētais laiks"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potenciālais ietaupījums (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potenciālais ietaupījums (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potenciālais ietaupījums: {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potenciālais ietaupījums: {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Rādīt pārbaudes"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Sākotnējā navigācija"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maksimālais kritiskais ceļa latentums:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Kļūda!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Pārskata kļūda: nav pārbaudes informācijas"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboratorijas dati"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse] (https://developers.google.com/web/tools/lighthouse/) pašreizējās lapas analīze emulētajā 3G. Vērtības ir aptuvenas un var atšķirties."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Papildu vienumi manuālai pārbaudei"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nav piemērojams"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Iespēja"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Aptuvenais ietaupījums"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Izpildītās pārbaudes"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Rādītāja mērogs:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Radās problēmas, kas ietekmēja šo Lighthouse palaišanu:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Vērtības ir aptuvenas un var atšķirties."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Brīdinājumi: "}};
+
+
+},{}],62:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome-extensies hadden een negatieve invloed op de laadprestaties van deze pagina. Controleer de pagina in de incognitomodus of via een Chrome-profiel zonder extensies."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Scriptevaluatie"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Script parseren"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Totaal"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Overweeg minder tijd te besteden aan het parseren, compileren en uitvoeren van JS. Het leveren van kleinere JS-payloads kan hierbij helpen. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Verkort de JavaScript-uitvoeringstijd"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript-uitvoeringstijd"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Grote gif's zijn niet efficiënt om content met animaties te leveren. Overweeg in plaats van gif's MPEG4-/WebM-video's voor animaties en PNG/WebP voor statische afbeeldingen en bespaar zo netwerkbytes. [Meer informatie](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Gebruik video-indelingen voor content met animaties"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Overweeg afbeeldingen die niet in beeld zijn en verborgen afbeeldingen via 'lazy loading' te laden nadat alle kritieke bronnen zijn geladen om zo de tijd tot interactief te verlagen. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Laad afbeeldingen die niet in beeld zijn nog niet"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Bronnen blokkeren de eerste tekenbewerking voor je pagina. Overweeg kritieke JS/css inline te leveren en alle niet-kritieke JS/stijlen uit te stellen. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Verwijder bronnen die de weergave blokkeren"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Grote netwerkpayloads kosten gebruikers veel geld en hebben vaak lange laadtijden. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Totale grootte was {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Vermijd enorme netwerkpayloads"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Vermijdt enorme netwerkpayloads"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Als je css-bestanden verkleint, kun je de omvang van netwerkpayloads verkleinen. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Verklein de css"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Als je JavaScript-bestanden verkleint, kunnen de omvang van de payload en de parseringstijd van het script worden verkleind. [Meer informatie](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Verklein JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Verwijder niet-gebruikte regels uit stylesheets om het aantal onnodige bytes te verminderen die worden verbruikt door netwerkactiviteit. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Stel niet-gebruikte css uit"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Verwijder ongebruikt JavaScript om het aantal bytes te verminderen dat wordt verbruikt door netwerkactiviteit."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Verwijder ongebruikt JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Een lange levensduur voor het cachegeheugen kan herhaalde bezoeken aan je pagina versnellen. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 bron gevonden}other{# bronnen gevonden}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Lever statische items met een efficiënt cachebeleid"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Gebruikt een efficiënt cachebeleid voor statische items"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Geoptimaliseerde afbeeldingen worden sneller geladen en verbruiken minder mobiele data. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Codeer afbeeldingen op een efficiënte manier"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Lever afbeeldingen met het juiste formaat om mobiele data te besparen en de laadtijd te verbeteren. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Geef afbeeldingen het juiste formaat"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Tekstgebaseerde bronnen moeten worden geleverd met compressie (gzip, deflate of brotli) om het totale aantal netwerkbytes te minimaliseren. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Schakel tekstcompressie in"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Afbeeldingsindelingen zoals JPEG 2000, JPEG XR en WebP bieden vaak betere compressie dan PNG of JPEG. Dit resulteert in snellere downloads en minder dataverbruik. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Lever afbeeldingen in moderne indelingen"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"De onderstaande kritieke verzoekketens laten zien welke bronnen met een hoge prioriteit worden geladen. Overweeg de lengte van ketens te verkleinen, de downloadgrootte van bronnen te beperken of het downloaden van onnodige bronnen uit te stellen om de laadtijd van de pagina te verbeteren. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 keten gevonden}other{# ketens gevonden}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimaliseer de diepte van kritieke verzoeken"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Browser-engineers bevelen aan dat pagina's minder dan ~1500 DOM-knooppunten bevatten. De perfecte balans is een structuurdiepte van minder dan 32 elementen en minder dan 60 onderliggende/bovenliggende elementen. Een grote DOM kan ervoor zorgen dat het geheugengebruik toeneemt. Dit leidt tot langere [stijlberekeningen](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) en produceert dure [dynamische lay-outaanpassingen](https://developers.google.com/speed/articles/reflow). [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 knooppunt}other{# knooppunten}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Vermijd een overmatig grote DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximum DOM-diepte"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Totaal aantal DOM-knooppunten"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Vermijdt een overmatige grote DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Maak gebruik van de css-functie 'font-display' om ervoor te zorgen dat tekst zichtbaar is voor gebruikers terwijl weblettertypen worden geladen. [Meer informatie](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Zorg ervoor dat tekst zichtbaar blijft tijdens het laden van weblettertypen"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Alle tekst blijft zichtbaar tijdens het laden van weblettertypen"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Categorie"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Overweeg minder tijd te besteden aan het parseren, compileren en uitvoeren van JS. Het leveren van kleinere JS-payloads kan hierbij helpen."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Primaire threadbewerkingen minimaliseren"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Primaire threadbewerkingen minimaliseren"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"De bovenstaande score is een schatting van hoelang het duurt voordat je app reageert op gebruikersinvoer (in milliseconden) gedurende de drukste periode van 5 seconden tijdens het laden van de pagina. Als de wachttijd langer dan 50 ms is, kunnen gebruikers je app als traag beschouwen. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Geschatte invoerwachttijd"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"'Eerste tekenbewerking met content' geeft het tijdstip aan waarop de eerste tekst of afbeelding is weergegeven. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Eerste tekenbewerking met content"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"'Eerste keer dat CPU inactief was' geeft de eerste keer aan dat de primaire thread van de pagina rustig genoeg was om invoer te verwerken. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Eerste keer dat CPU inactief was"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"'Eerste zinvolle tekenbewerking' meet wanneer de primaire content van een pagina zichtbaar is. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Eerste zinvolle tekenbewerking"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interactief geeft het tijdstip aan waarop de pagina volledig interactief is. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tijd tot interactief"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Snelheidsindex laat zien hoe snel de content van een pagina zichtbaar is. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Snelheidsindex"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Omleidingen zorgen voor extra vertraging voordat de pagina kan worden geladen. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Vermijd meerdere pagina-omleidingen"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"'Tijd tot eerste byte' identificeert het tijdstip waarop je server een reactie stuurt. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Hoofddocument duurde {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Beperk serverreactietijden (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Serverreactietijden zijn laag (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Duur"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Naam"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Begintijd"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Type"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Overweeg je app te voorzien van de API voor gebruikerstiming om de daadwerkelijke prestaties van je app tijdens belangrijke gebruikerservaringen te meten. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 gebruikerstiming}other{# gebruikerstimings}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Markeringen en metingen voor gebruikerstiming"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Overweeg hints voor het vooraf verbinden of dns-prefetchen van bronnen toe te voegen om vroege verbindingen met belangrijke externe herkomsten tot stand te brengen. [Meer informatie](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Maak vooraf verbinding met vereiste herkomsten"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Overweeg <link rel=preload> te gebruiken om prioriteit te geven aan het ophalen van bronnen die momenteel later tijdens het laden van de pagina worden opgehaald. [Meer informatie](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Laad belangrijke verzoeken vooraf"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Meer informatie over de prestaties van je app."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostische gegevens"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Het meest essentiële aspect van de prestaties is hoe snel pixels worden weergegeven op het scherm. Belangrijkste statistieken: Eerste tekenbewerking met content, Eerste zinvolle tekenbewerking"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Verbeteringen voor eerste tekenbewerking"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Deze optimalisaties kunnen het laden van je pagina versnellen."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Aanbevelingen"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Statistieken"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Verbeter de algemene laadfunctionaliteit, zodat de pagina zo snel mogelijk reageert en gebruiksklaar is. Belangrijkste statistieken: Tijd tot interactief, Snelheidsindex"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Algemene verbeteringen"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Prestaties"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Cache-TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Grootte (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Bestede tijd"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potentiële besparing (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potentiële besparing (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potentiële besparing van {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potentiële besparing van {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Controles weergeven"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Beginnavigatie"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maximum wachttijd voor kritiek pad:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Fout"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Rapportfout: geen controlegegevens"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Labgegevens"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Analyse met [Lighthouse](https://developers.google.com/web/tools/lighthouse/) van de huidige pagina bij een 3G-emulatie. Waarden worden geschat en kunnen variëren."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Aanvullende items om handmatig te controleren"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"N.v.t."},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Aanbeveling"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Geschatte besparing"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Geslaagde controles"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Scoreschaal:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Er zijn problemen opgetreden bij deze uitvoering van Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Waarden worden geschat en kunnen variëren."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Waarschuwingen: "}};
+
+
+},{}],63:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome-utvidelser gjør innlastingen av denne siden tregere. Prøv å revidere siden i inkognitomodus eller fra en Chrome-profil uten utvidelser."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Skriptevaluering"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Skriptparsing"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Totalt"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Vurder å redusere tiden som brukes til parsing, kompilering og kjøring i JS. Levering av mindre JS-nyttelaster kan bidra til dette. [Finn ut mer] (https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Reduser JavaScript-kjøretiden"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript-kjøretid"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Store GIF-er er mindre effektive for levering av animert innhold. I stedet for GIF bør du vurdere bruk av MPEG4/WebM-videoer for animasjon og PNG/WebP for statiske bilder, da dette belaster nettverket mindre. [Finn ut mer] (https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Bruk videoformat for animert innhold"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Vurder «lat» innlasting av bilder som er utenfor skjermen eller skjult, etter at alle kritiske ressurser er ferdig innlastet, for å redusere tiden det tar før siden blir interaktiv. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Utsett bilder utenfor skjermen"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Ressurser blokkerer den første opptegningen av siden din. Vurder å levere kritisk JS/CSS innebygd og utsette all JS / alle stiler som ikke er kritiske. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Eliminer ressurser som blokkerer gjengivelse"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Store nettverksressurser koster brukerne mer og er hovedgrunnen til lange innlastingstider. [Finn ut mer] (https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Den totale størrelsen var {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Unngå enorme nettverksressurser"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Unngår enorme nettverksbelastninger"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Forminskede CSS-filer kan redusere nettverksbelastningen. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Forminsk CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Forminsking av JavaScript-filer kan redusere nyttelaststørrelser og parsetiden for skript. [Finn ut mer](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Forminsk JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Fjern ubrukte regler fra stilark for å redusere unødvendige byte som brukes av nettverksaktiviteten. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Utsett ubrukt CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Fjern ubrukt JavaScript for å redusere antall byte som brukes av nettverksaktiviteten."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Fjern ubrukt JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"En lang bufferlevetid kan øke antall gjentatte besøk på siden din. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ressurs funnet}other{# ressurser funnet}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Vis statiske ressurser med effektive buffer-retningslinjer"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Bruker effektive buffer-retningslinjer på statiske ressurser"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimaliserte bilder lastes inn raskere og bruker mindre mobildata [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Effektiviser omgjøring av bilder til kode"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Vis bilder som har passende størrelse, for å spare mobildata og få kortere innlastingstid. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Velg riktige bildestørrelser"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Tekstbaserte ressurser bør leveres komprimert (gzip, deflate eller brotli) for å minimerer antall byte gjennom nettverket. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Aktiver tekstkomprimering"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Bildeformater som JPEG 2000, JPEG XR og WebP gir ofte bedre komprimering enn PNG eller JPEG, noe som betyr raskere nedlasting og mindre databruk. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Bruk nyere bildeformater"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"De kritiske forespørselskjedene nedenfor viser hvilke ressurser som er utstedt med høy prioritet. Vurder å redusere lengden på kjedene, redusere nedlastingsstørrelsen på ressurser eller utsette nedlasting av unødvendige ressurser for å bedre sideinnlastingen. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 kjede funnet}other{# kjeder funnet}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimer dybden på kritiske forespørsler"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Nettlesereksperter anbefaler at sider inneholder mindre enn ca. 1500 DOM-noder. Den perfekte verdien er en tredybde på mindre enn 32 elementer og mindre enn 60 underordnede/overordnede elementer. En stor DOM-struktur kan øke minnebruken, føre til at [stilberegninger](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) tar lengre tid, og forårsake kostbare [gjenoppbygginger av sidevisningen](https://developers.google.com/speed/articles/reflow). [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 node}other{# noder}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Unngå for stor DOM-struktur"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksimal DOM-dybde"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Totalt antall DOM-noder"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Unngå for stor DOM-struktur"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Bruk CSS-funksjonen font-display til å forsikre deg om at brukerne ser teksten mens skrifttypen for nettet lastes inn. [Finn ut mer](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Sørg for at teksten forblir synlig under innlasting av skrifttyper for nettet"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"All tekst forblir synlig under innlasting av skrifttype for nettet"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategori"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Vurder å redusere tiden som brukes til parsing, kompilering og kjøring i JS. Levering av mindre JS-ressurser kan bidra til dette."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimer arbeidet på hovedtråden"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimerer arbeidet på hovedtråden"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Poengsummen ovenfor er et estimat av hvor lang tid (i millisekunder) det tar for appen din å svare på brukerinndata i det travleste 5-sekunders vinduet av sideinnlastingen. Hvis tidsforsinkelsen er høyere enn 50 ms, kan brukeren oppleve appen din som treg. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Anslått tidsforsinkelse for inndata"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Den første innholdsrike opptegningen (FCP) markerer den første gangen tekst eller bilder tegnes opp. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Første innholdsrike opptegning"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Første prosessor ledig markerer den første gangen sidens hovedtråd er stille nok til å klare å håndtere inndata. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Første prosessor ledig"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Første vesentlige opptegning måler når hovedinnholdet på en side er synlig. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Første vesentlige opptegning"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Tid til interaktiv markerer tiden når siden er helt interaktiv. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tid til interaktiv"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Hastighetsindeksen viser hvor raskt innhold på en side blir synlig. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Hastighetsindeks"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Viderekoblinger fører til flere forsinkelser før siden kan lastes inn. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Unngå flere viderekoblinger av siden"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Tid til første byte identifiserer tidspunktet da tjeneren sendte et svar. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Root-dokumentet brukte {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Reduser responstiden for tjener (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Svartiden til tjeneren er lav (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Varighet"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Navn"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Starttid"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Type"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Vurder å utstyre appen din med User Timing API for å måle appens reelle ytelse under viktige brukeropplevelser. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{ 1 brukertiming}other{# brukertiminger}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"User Timing – merker og intervaller"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Vurder å legge til ressurshint (preconnect eller dns-prefetch) for å opprette tidlige tilkoblinger til viktige tredjepartsplasseringer. [Finn ut mer] (https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Opprett forhåndstilkobling til nødvendige domenenavn"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Vurder bruk av <link rel=preload> for å prioritere henting av ressurser som for øyeblikket er forespurt senere i sideinnlastingen. [Finn ut mer](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Forhåndsinnlast (preload) nøkkelforespørsler"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Mer informasjon om ytelsen til appen din."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostikk"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Det mest kritiske aspektet for ytelse er hvor raskt piksler blir gjengitt på skjermen. Nøkkelberegninger: Første innholdsrike opptegning, Første vesentlige opptegning"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Forbedringer av første opptegning"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Disse optimaliseringene kan gjøre sideinnlastingen raskere."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Muligheter"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Beregninger"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Gjør den totale innlastingsopplevelsen bedre, slik at siden reagerer og er klar til bruk så snart som mulig. Nøkkelberegninger: Tid til interaktiv, Hastighetsindeks"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Forbedringsmuligheter"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Resultater"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Buffer-TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Størrelse (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Brukt tid"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"Nettadresse"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potensielle besparelser (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potensielle besparelser (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potensielle besparelser på {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potensiell besparelse på {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Vis revisjoner"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navigasjonsstart"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maksimum kritisk baneforsinkelse:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Feil!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Rapportfeil: ingen revisjonsinformasjon"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Prøvefunksjonsdata"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse]-analyse (https://developers.google.com/web/tools/lighthouse/) av den gjeldende siden på emulert 3G. Verdiene er anslått og kan variere."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Tilleggselementer for manuell kontroll"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Ikke relevant"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Mulighet"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Estimerte besparelser"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Beståtte revisjoner"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Poengskala:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Det oppsto problemer som påvirker denne kjøringen av Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Verdiene er anslått og kan variere."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Advarsler: "}};
+
+
+},{}],64:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Rozszerzenia Chrome pogorszyły szybkość ładowania tej strony. Przeprowadź audyt strony w trybie incognito lub w profilu Chrome bez rozszerzeń."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Ocena skryptu"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Analiza skryptów"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Razem"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Pomyśl o skróceniu czasu poświęcanego na analizowanie, kompilowanie i wykonywanie kodu JS. Może w tym pomóc dostarczanie mniejszych ładunków JS. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/bootup)"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Skróć czas wykonywania JavaScriptu"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Czas wykonania JavaScriptu"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Duże pliki GIF są nieefektywnym sposobem dostarczania animacji. Proponujemy użyć zamiast nich filmów MPEG4/WebM (animacje) lub plików PNG/WebP (obrazy statyczne), by zmniejszyć ilość przesyłanych danych. [Więcej informacji](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Użyj formatów wideo dla animacji"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Rozważ opóźnione (leniwe) ładowanie obrazów ukrytych i znajdujących się poza ekranem dopiero po zakończeniu ładowania wszystkich zasobów kluczowych, by skrócić czas do pełnej interaktywności. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Odłóż ładowanie obrazów poza ekranem"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Zasoby blokują pierwsze wyrenderowanie strony. Rozważ umieszczenie krytycznego kodu JS/CSS w kodzie strony i opóźnienie ładowania wszystkich niekrytycznych plików JS i stylów. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Wyeliminuj zasoby blokujące renderowanie"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Duże ładunki sieciowe powodują wyższe koszty dla użytkowników i są mocno powiązane z długim czasem ładowania. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Łączny rozmiar to {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Unikaj bardzo dużych ładunków sieciowych"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Unikaj bardzo dużych ładunków sieciowych"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Minifikacja plików CSS może zmniejszyć ładunki sieciowe. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/minify-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minifikuj CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Minifikacja plików JavaScript może zmniejszyć ładunki i skrócić czas analizowania skryptów. [Więcej informacji](https://developers.google.com/speed/docs/insights/MinifyResources)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minifikuj JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Usuń nieużywane reguły z arkuszy stylów, by zmniejszyć ilość danych przesyłanych w sieci. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/unused-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Opóźnij ładowanie nieużywanego kodu CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Usuń nieużywany kod JavaScript, by zmniejszyć ilość danych przesyłanych w sieci."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Usuń nieużywany JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Długi czas przechowywania w pamięci podręcznej może przyspieszyć ponowne otwarcie strony. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Znaleziono 1 zasób}few{Znaleziono # zasoby}many{Znaleziono # zasobów}other{Znaleziono # zasobu}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Wyświetlaj zasoby statyczne, stosując efektywne zasady pamięci podręcznej"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Stosuje efektywne zasady pamięci podręcznej dla zasobów statycznych"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Zoptymalizowane obrazy ładują się szybciej i wykorzystują mniej komórkowej transmisji danych. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Użyj efektywnego kodowania obrazów"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Wyświetlaj obrazy o odpowiednim rozmiarze, by oszczędzać komórkową transmisję danych i przyspieszyć ładowanie. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Zmień rozmiar obrazów"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Zasoby tekstowe powinny być kompresowane (gzip, deflate lub brotli), by zminimalizować ilość danych przesyłanych w sieci. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/text-compression)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Włącz kompresję tekstu"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Formaty obrazów, takie jak JPEG 2000, JPEG XR i WebP, często dają lepszą kompresję niż PNG czy JPEG, co przekłada się na szybsze pobieranie i mniejsze wykorzystanie danych. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/webp)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Wyświetlaj obrazy w formatach nowej generacji"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Poniższe łańcuchy żądań krytycznych pokazują zasoby ładowane z wysokim priorytetem. Aby przyspieszyć ładowanie strony, możesz skrócić łańcuchy, zmniejszyć rozmiar pobieranych zasobów lub opóźnić pobieranie zasobów, które nie są niezbędne. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)"},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Znaleziono 1 łańcuch}few{Znaleziono # łańcuchy}many{Znaleziono # łańcuchów}other{Znaleziono # łańcucha}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Zminimalizuj głębię żądań krytycznych"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Twórcy przeglądarek zalecają, by strony zawierały mniej niż około 1500 węzłów DOM. Optymalne jest drzewo o głębokości mniejszej niż 32 elementy i zawierające mniej niż 60 elementów podrzędnych/nadrzędnych. Duży DOM może zwiększyć wykorzystanie pamięci, wydłużyć [obliczanie stylów](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) i powodować kosztowne [przeformatowanie układu](https://developers.google.com/speed/articles/reflow). [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/dom-size)"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 węzeł}few{# węzły}many{# węzłów}other{# węzła}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Unikaj zbyt dużego DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksymalna głębokość DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Łączna liczba węzłów DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Unika zbyt dużego DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Użyj funkcji CSS „font-display”, by zapewnić widoczność tekstu dla użytkownika podczas ładowania czcionek internetowych. [Więcej informacji](https://developers.google.com/web/updates/2016/02/font-display)"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Zapewnij widoczność tekstu podczas ładowania czcionek internetowych"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Cały tekst pozostaje widoczny podczas ładowania czcionek internetowych"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategoria"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Pomyśl o skróceniu czasu poświęcanego na analizowanie, kompilowanie i wykonywanie kodu JS. Może w tym pomóc dostarczanie mniejszych ładunków JS."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Zminimalizuj aktywność głównego wątku"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimalizuje aktywność głównego wątku"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Powyższy wynik jest szacunkowym czasem (w milisekundach), po którym aplikacja reaguje na działanie użytkownika w trakcie najbardziej intensywnego, pięciosekundowego okresu ładowania strony. Jeśli opóźnienie jest większe niż 50 ms, użytkownicy mogą uznać aplikację za powolną. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Szacowane opóźnienie reakcji"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Pierwsze wyrenderowanie treści oznacza czas wyrenderowania pierwszego tekstu lub obrazu. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Pierwsze wyrenderowanie treści"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"CPU bezczynny po raz pierwszy oznacza czas, gdy wątek główny jest po raz pierwszy na tyle mało obciążony, że może obsługiwać działania użytkownika. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU bezczynny po raz pierwszy"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Pierwsze wyrenderowanie czegoś znaczącego oznacza czas pojawienia się na ekranie głównej zawartości strony. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Pierwsze wyrenderowanie czegoś znaczącego"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Czas do pełnej interaktywności oznacza czas, po którym strona jest całkowicie interaktywna. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Czas do pełnej interaktywności"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Indeks szybkości wskazuje, jak szybko strona zapełnia się widocznymi treściami. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/speed-index)"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Indeks szybkości"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Przekierowania wprowadzają dodatkowe opóźnienia przed rozpoczęciem ładowania strony. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/redirects)"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Unikaj wielokrotnych przekierowań"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Czas do pierwszego bajtu oznacza czas wysłania odpowiedzi przez serwer. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/ttfb)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Czas odpowiedzi głównego dokumentu: {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Skróć czasy reakcji serwera (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Czasy odpowiedzi serwera są krótkie (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Czas trwania"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nazwa"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Czas rozpoczęcia"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Typ"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Do aplikacji możesz dodać obsługę interfejsu User Timing API, by mierzyć rzeczywistą szybkość aplikacji z punktu widzenia użytkownika. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/user-timing)"},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 czas działań użytkownika}few{# czasy działań użytkownika}many{# czasów działań użytkownika}other{# czasu działań użytkownika}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Znaczniki i odcinki Czasu działań użytkownika"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Rozważ dodanie wskazówek „preconnect” lub „dns-prefetch”, by wcześniej nawiązać połączenia z ważnymi źródłami w innych domenach. [Więcej informacji](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Wcześniej nawiąż połączenia z wymaganymi źródłami"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Pomyśl o użyciu deklaracji <link rel=preload>, by szybciej pobierały się zasoby, które są obecnie żądane na dalszym etapie ładowania strony. [Więcej informacji](https://developers.google.com/web/tools/lighthouse/audits/preload)"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Załaduj wstępnie kluczowe żądania"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Więcej informacji o wydajności aplikacji."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostyka"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Najważniejszym aspektem wydajności jest to, jak szybko piksele zostaną wyświetlone na ekranie. Kluczowe wskaźniki: Pierwsze wyrenderowanie treści, Pierwsze wyrenderowanie czegoś znaczącego"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Ulepszenia pierwszego renderowania"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Te optymalizacje mogą przyspieszyć ładowanie stron."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Możliwości"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Dane"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Usprawnij całe ładowanie, by strona jak najszybciej była gotowa do używania i reagowała na działania użytkownika. Główne wskaźniki: Czas do pełnej interaktywności, Indeks szybkości"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Ogólne usprawnienia"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Wydajność"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Czas przechowywania danych w pamięci podręcznej"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Rozmiar (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Spędzony czas"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potencjalne oszczędności (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potencjalne oszczędności (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potencjalna oszczędność: {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potencjalne przyspieszenie o {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Pokaż audyty"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Początkowa nawigacja"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maksymalne opóźnienie ścieżki krytycznej:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Błąd"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Błąd raportu: brak informacji o audycie"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Dane laboratoryjne"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Analiza [Lighthouse](https://developers.google.com/web/tools/lighthouse/) bieżącej strony przy emulowanym połączeniu 3G. Wartości są szacunkowe i mogą się zmieniać."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Dodatkowe elementy do ręcznego sprawdzenia"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nie dotyczy"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Możliwość"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Szacowane oszczędności"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Zaliczone audyty"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Skala wyników:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Podczas tego uruchomienia Lighthouse wystąpiły problemy:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Wartości są szacunkowe i mogą się zmieniać."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Ostrzeżenia "}};
+
+
+},{}],65:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"As extensões do Chrome afetam negativamente o desempenho de carregamento desta página. Experimente efetuar uma auditoria à página no modo de navegação anónima ou com um perfil do Chrome sem extensões."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Avaliação do script"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Análise do script"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Considere reduzir o tempo despendido a analisar, compilar e executar JS. Poderá descobrir que é útil fornecer payloads de JS mais pequenos. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Reduza o tempo de execução de JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Tempo de execução de JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Os GIFs grandes são ineficientes para publicar conteúdo animado. Para poupar bytes de rede, considere utilizar vídeos MPEG4/WebM para animações e ficheiros PNG/WebP para imagens estáticas em vez de GIFs. [Saiba mais](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)."},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Utilize formatos de vídeo para conteúdo animado"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Considere utilizar imagens de carregamento lento não visíveis e ocultas após a conclusão do carregamento de todos os recursos críticos, para reduzir o tempo até à interação. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Adie as imagens não visíveis"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"O primeiro preenchimento da sua página está a ser bloqueado por recursos. Considere publicar JS/CSS críticos inline e adiar todos os JS/estilos não críticos. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Elimine recursos que bloqueiam o processamento"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Os grandes payloads de rede têm custos reais para os utilizadores e estão fortemente correlacionados com tempos de carregamento demorados. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"O tamanho total foi de {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Evite enormes payloads de rede"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Evita enormes payloads de rede"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Reduzir os ficheiros CSS pode reduzir os tamanhos dos payloads de rede. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Reduza o CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Reduzir os ficheiros JavaScript pode reduzir os tamanhos dos payloads e o tempo de análise de scripts. [Saiba mais](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Reduza o JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Remova regras não utilizadas das folhas de estilos para reduzir a quantidade de bytes desnecessários consumidos pela atividade da rede. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Adie o CSS não utilizado"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Remova o JavaScript não utilizado para reduzir os bytes consumidos pela atividade da rede."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Remova o JavaScript não utilizado"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Uma duração total longa da cache pode acelerar as visitas repetidas à sua página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 recurso encontrado}other{# recursos encontrados}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Publique recursos estáticos com uma política de cache eficiente"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Utiliza uma política de cache eficiente em recursos estáticos"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"As imagens otimizadas são carregadas mais rapidamente e consomem menos dados móveis. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Codifique as imagens de forma eficiente"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Publique imagens com um tamanho adequado para poupar dados móveis e melhorar o tempo de carregamento. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Dimensione adequadamente as imagens"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Os recursos baseados em texto devem ser publicados com compressão (gzip, Deflate ou Brotli) para reduzir o total de bytes de rede. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Ative a compressão de texto"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Muitas vezes, os formatos de imagem como JPEG 2000, JPEG XR e WebP proporcionam uma melhor compressão do que os formatos PNG ou JPEG, o que se traduz em transferências mais rápidas e num menor consumo de dados. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Publique imagens em formatos de última geração"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"As Cadeias de pedidos críticos abaixo apresentam os recursos que são carregados com uma prioridade elevada. Pondere reduzir o comprimento das cadeias, reduzir o tamanho de transferência dos recursos ou adiar a transferência de recursos desnecessários para melhorar o carregamento da página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 cadeia encontrada}other{# cadeias encontradas}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Reduza a profundidade de pedidos críticos"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Os engenheiros de navegadores recomendam que as páginas contenham menos de ~1500 nós de DOM. O ideal é uma árvore com uma profundidade < 32 elementos e menos de 60 elementos superiores/secundários. Um DOM grande pode aumentar a utilização da memória, gerar [cálculos de estilo](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) mais demorados e produzir [ajustes de esquema](https://developers.google.com/speed/articles/reflow) dispendiosos. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 nó}other{# nós}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Evite um tamanho excessivo do DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Profundidade máxima do DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Total de nós do DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Evita um tamanho excessivo do DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Tire partido da funcionalidade CSS de apresentação de tipos de letra para garantir que o texto é visível para o utilizador enquanto os tipos de letra para Websites são carregados. [Saiba mais](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Garanta que o texto permanece visível durante o carregamento de tipos de letra para Websites"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Todo o texto permanece visível durante os carregamentos de tipos de letra para Websites"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Categoria"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Considere reduzir o tempo despendido a analisar, compilar e executar JS. Poderá descobrir que é útil fornecer payloads de JS mais pequenos."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Reduzir as operações do thread principal"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Reduz as operações do thread principal"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"A pontuação acima é uma estimativa do tempo que a sua aplicação demora a responder a ações do utilizador, em milissegundos, durante a janela dos 5 segundos mais ativos de carregamento de página. Se a latência for superior a 50 ms, os utilizadores poderão considerar que a sua aplicação é lenta. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Latência estimada das ações"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"O Primeiro preenchimento com conteúdo assinala o momento de preenchimento com o primeiro texto ou a primeira imagem. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Primeiro preenchimento com conteúdo"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"A métrica Primeira CPU inativa indica quando é que o thread principal da página está suficientemente inativo pela primeira vez para processar ações. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Primeira CPU inativa"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"A métrica Primeiro preenchimento significativo mede quando é que o conteúdo principal de uma página fica visível. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Primeiro preenchimento significativo"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"A métrica Tempo até à interação indica quando é que a página fica completamente interativa. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tempo até à interação"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"A métrica Índice de velocidade apresenta a rapidez de preenchimento visível dos conteúdos de uma página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Índice de velocidade"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"A auditoria Redirecionamentos introduz atrasos adicionais antes do carregamento da página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Evite vários redirecionamentos de página"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"A auditoria Tempo até ao primeiro byte indica o tempo de envio de uma resposta pelo seu servidor. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"O documento de raiz demorou {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Reduza os tempos de resposta do servidor (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Os tempos de resposta do servidor são curtos (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Duração"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nome"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Hora de início"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tipo"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Pondere a possibilidade de complementar a sua aplicação com a API Tempos do utilizador para analisar o desempenho da aplicação no mundo real durante as principais experiências do utilizador. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 tempo do utilizador}other{# tempos do utilizador}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Marcas e medições de Tempos do utilizador"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Considere adicionar instruções para recursos de pré-ligação ou de obtenção prévia de DNS para estabelecer ligações antecipadamente a origens de terceiros importantes. [Saiba mais](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Efetue a pré-ligação às origens necessárias"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Considere utilizar <link rel=preload> para dar prioridade à obtenção de recursos que são atualmente solicitados mais tarde no carregamento de página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Pré-carregue pedidos-chave"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Mais informações sobre o desempenho da sua aplicação."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnósticos"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"O aspeto mais importante do desempenho é a rapidez de renderização dos píxeis no ecrã. Métricas principais: Primeiro preenchimento com conteúdo, Primeiro preenchimento significativo."},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Melhorias no primeiro preenchimento"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Estas otimizações podem acelerar o carregamento da sua página."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Oportunidades"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Métricas"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Melhore a experiência de carregamento geral para que a página responda e fique pronta a utilizar logo que possível. Métricas principais: Tempo até à interação, Índice de velocidade."},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Melhorias gerais"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Desempenho"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL da cache"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Tamanho (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Tempo gasto"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Poupança potencial (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Poupança potencial (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Poupança potencial de {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Poupança potencial de {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} seg"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Mostrar auditorias"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navegação inicial"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latência crítica máxima do caminho:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Erro!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Erro de relatório: sem informações de auditoria"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Dados laboratoriais"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) análise da página atual em rede 3G emulada. Os valores são aproximados e podem variar."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Itens adicionais a verificar manualmente"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Não aplicável"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Oportunidade"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Poupança estimada"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Auditorias aprovadas"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Escala da pontuação:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Ocorreram problemas que afetaram esta execução do Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Os valores são estimados e podem variar."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Avisos: "}};
+
+
+},{}],66:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"As extensões do Chrome afetaram negativamente o desempenho de carregamento desta página. Tente fazer a auditoria da página no modo de navegação anônima ou em um perfil do Chrome sem extensões."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Avaliação de script"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Análise de script"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Reduza o tempo gasto com análise, compilação e execução de JS. Você perceberá que exibir payloads de JS menores ajuda a fazer isso. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Reduza o tempo de execução de JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Tempo de execução de JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"GIFs grandes são ineficazes para exibir conteúdo animado. Use vídeos MPEG4/WebM para animações e PNG/WebP para imagens estáticas em vez de GIF, para economizar bytes de rede. [Saiba mais](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Use formatos de vídeo para conteúdo animado"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Use o carregamento lento para imagens fora da tela e ocultas depois que todos os recursos críticos já estiverem carregados, para reduzir o tempo necessário até que a página se torne interativa. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Adie imagens fora da tela"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Alguns recursos estão bloqueando o primeiro aparecimento da sua página. Considere exibir JS/CSS crítico inline e adiar todos os JS/estilos não críticos. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Elimine recursos que impedem a renderização"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Grandes payloads de rede geram custos para os usuários e estão altamente relacionados a tempos maiores de carregamento. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"O tamanho total foi de {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Evite payloads de rede muito grandes"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Evita payloads de rede muito grandes"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"A redução de arquivos CSS pode diminuir o tamanho do payload de rede. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Reduza o CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"A redução de arquivos JavaScript pode diminuir o tamanho de payloads e o tempo de análise de scripts. [Saiba mais](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Reduza o JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Remova regras não utilizadas das folhas de estilos para reduzir o consumo desnecessário de bytes da atividade de rede. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Adie CSS não utilizado"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Remova o JavaScript não utilizado para reduzir o consumo de bytes da atividade de rede."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Remova o JavaScript não utilizado"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Um cache com ciclo de vida longo pode acelerar visitas repetidas à sua página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 recurso encontrado}one{# recurso encontrado}other{# recursos encontrados}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Disponibilize recursos estáticos com uma política de cache eficiente"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Usa uma política de cache eficiente em recursos estáticos"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Imagens otimizadas são carregadas mais rapidamente e consomem menos dados da rede celular. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Codifique as imagens com eficiência"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Disponibilize imagens de tamanho adequado para economizar dados da rede celular e melhorar o tempo de carregamento. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Defina um tamanho adequado para as imagens"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Os recursos baseados em texto precisam ser disponibilizados com compactação (gzip, deflate ou brotli) para reduzir o total de bytes da rede. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Ative a compactação de texto"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Formatos de imagem como JPEG 2000, JPEG XR e WebP geralmente resultam em uma compactação melhor em comparação a PNG ou JPEG, o que significa downloads mais rápidos e menor consumo de dados. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Disponibilize imagens em formatos de última geração"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"As redes de solicitações críticas abaixo mostram os recursos carregados com alta prioridade. Reduza o tamanho das redes ao diminuir o tamanho do download dos recursos ou ao adiar o download de recursos desnecessários para melhorar o carregamento de página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 rede encontrada}one{# rede encontrada}other{# redes encontradas}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Reduza a profundidade de solicitações críticas"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Os engenheiros de navegador recomendam que as páginas tenham menos de ~1.500 nós de DOM. O ideal é uma profundidade de árvore com < 32 elementos e menos de 60 elementos filhos/pais. Um DOM grande pode aumentar o uso da memória, causar [cálculos de estilo] mais longos (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) e produzir [reflows de layout] de alto custo (https://developers.google.com/speed/articles/reflow). [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 nó}one{# nó}other{# nós}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Evite DOM de tamanho excessivo"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Profundidade máxima de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Total de nós de DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Evita DOM de tamanho excessivo"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Use o recurso CSS de exibição de fonte para garantir que o texto possa ser visto pelo usuário enquanto as webfonts são carregadas. [Saiba mais](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Garanta que o texto continue visível durante o carregamento da webfont"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Todo o texto continua visível durante o carregamento da webfont"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Categoria"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Reduza o tempo gasto com análise, compilação e execução de JS. Você perceberá que exibir payloads de JS menores ajuda a fazer isso."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimize o trabalho da thread principal"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimiza o trabalho da thread principal"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"A pontuação acima é uma estimativa do tempo que seu aplicativo leva para responder à atividade do usuário, em milésimos de segundo, durante a janela de carregamento de página mais movimentada de cinco segundos. Se a latência for superior a 50 ms, o usuário poderá notar lentidão no aplicativo. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Latência de entrada estimada"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"A primeira exibição de conteúdo marca o momento em que o primeiro texto ou imagem é disponibilizado. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Primeiro aparecimento com conteúdo"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"\"Primeira CPU ociosa\" marca a primeira vez que a thread principal da página fica silenciosa o suficiente para lidar com a entrada. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Primeira CPU ociosa"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"\"Primeiro aparecimento importante\" marca o momento em que o conteúdo principal de uma página se torna visível. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Primeiro aparecimento importante"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"\"Interativa\" marca o momento em que a página se torna totalmente interativa. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tempo até ficar interativa"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"O Índice de velocidade mostra a rapidez com que o conteúdo de uma página é preenchido visivelmente. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Índice de velocidade"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Os redirecionamentos causam mais atrasos antes do carregamento da página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Evite redirecionamentos múltiplos de página"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"\"Tempo até o primeiro byte\" identifica o momento em que seu servidor envia uma resposta. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"O documento raiz levou {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Reduza os tempos de resposta do servidor (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Os tempos de resposta do servidor são baixos (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Duração"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nome"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Horário de início"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tipo"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Instrumente seu app com a User Timing API para medir o desempenho real do app durante as principais experiências do usuário. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 velocidade do usuário}one{# velocidade do usuário}other{# velocidades do usuário}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Marcações e medições de User Timing"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Adicione dicas de recursos de pré-conexão ou pré-busca de DNS para estabelecer conexões antecipadas a origens importantes de terceiros. [Saiba mais](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Pré-conecte às origens necessárias"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Use <link rel=preload> para priorizar a busca posterior de recursos solicitados atualmente no carregamento de página. [Saiba mais](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Pré-carregue as principais solicitações"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Mais informações sobre o desempenho do seu aplicativo."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnóstico"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"O aspecto de desempenho mais importante é a rapidez com que os pixels são renderizados na tela. Principais métricas: Primeiro aparecimento com conteúdo, Primeiro aparecimento importante"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Melhorias do primeiro aparecimento"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Essas otimizações podem acelerar o carregamento de página."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Oportunidades"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Métricas"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Aprimore a experiência geral de carregamento, para que a página seja responsiva e esteja pronta para ser usada assim que possível. Principais métricas: Tempo até fica interativa, Índice de velocidade"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Melhorias gerais"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Desempenho"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Cache TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Tamanho (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Tempo gasto"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Possível economia (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Possível economia (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Possível economia de {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Possível economia de {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Mostrar auditorias"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navegação inicial"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latência máxima do caminho crítico:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Erro!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Informar erro: nenhuma informação de auditoria"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Dados de laboratório"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Análise do [Lighthouse](https://developers.google.com/web/tools/lighthouse/) da página atual em emulação de 3G. Os valores indicados são estimativas e podem variar."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Outros itens para verificação manual"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Não aplicável"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Oportunidade"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Economia estimada"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Auditorias aprovadas"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Escala de pontuação:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Alguns problemas afetaram esta execução do Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Os valores são estimados e podem variar."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Avisos: "}};
+
+
+},{}],67:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Extensiile Chrome au afectat performanța de încărcare a acestei pagini. Încearcă să auditezi pagina în modul incognito sau dintr-un profil Chrome fără extensii."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Evaluarea scripturilor"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Analizarea scripturilor"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Total"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Poți reduce timpul petrecut cu analizarea, compilarea și executarea JS. Livrarea unor sarcini JS mai mici poate ajuta în acest sens. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Redu timpul de execuție JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Timpul de executare JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"GIF-urile mari nu sunt eficiente pentru difuzarea conținutului animat. Folosește videoclipuri MPEG4/WebM pentru animații și PNG/WebP pentru imagini statice în locul GIF-urilor ca să economisești date în rețea. [Află mai multe](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Folosește formate video pentru conținut animat"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Poți încărca lent imaginile ascunse sau pe cele din afara ecranului după ce toate resursele esențiale s-au încărcat, pentru a micșora durata până la interactivitate. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Amână imaginile din afara ecranului"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resursele blochează prima redare a paginii. Poți să livrezi conținutul JS/CSS esențial inline și să amâni toate elementele JS/stilurile neesențiale. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Elimină resursele care blochează redarea"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Sarcinile mari de rețea îi costă pe utilizatori și sunt corelate cu timpi de încărcare îndelungați. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Dimensiunea totală a fost de {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Evită sarcinile uriașe de rețea"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Evită sarcinile uriașe de rețea"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Comprimarea fișierelor CSS poate reduce dimensiunea sarcinilor de rețea. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Comprimă codul CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Comprimarea fișierelor JavaScript poate reduce dimensiunea sarcinilor și timpul de analizare a scripturilor. [Află mai multe](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Comprimă codul JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Elimină regulile nefolosite din foile de stil pentru a reduce byții inutili consumați de activitatea rețelei. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Amână conținutul CSS nefolosit"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Elimină codul JavaScript nefolosit pentru a reduce byții consumați de activitatea rețelei."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Elimină codul JavaScript nefolosit"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"O durată lungă a memoriei cache poate grăbi accesările repetate ale paginii. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{o resursă găsită}few{# resurse găsite}other{# de resurse găsite}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Difuzează elementele statice cu o politică eficientă de stocare în memoria cache"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Folosește o politică eficientă de stocare în memoria cache pentru elementele statice"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Imaginile optimizate se încarcă mai repede și consumă mai puține date mobile. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Codifică eficient imaginile"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Difuzează imagini de dimensiuni corespunzătoare ca să economisești date mobile și să obții o încărcare mai rapidă. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Dimensionează corect imaginile"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Înainte de difuzare, resursele bazate pe text trebuie comprimate (gzip, deflate sau brotli) pentru a minimiza numărul total de byți în rețea. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Activează comprimarea textului"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Formatele de imagine ca JPEG 2000, JPEG XR și WebP oferă adesea o comprimare mai bună decât PNG sau JPEG, ceea ce înseamnă descărcări mai rapide și mai puțin consum de date. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Difuzează imagini în formate moderne"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Lanțurile de solicitări esențiale de mai jos îți arată ce resurse sunt încărcate cu prioritate ridicată. Poți să reduci lungimea lanțurilor, să reduci dimensiunea de descărcare a resurselor sau să amâni descărcarea de resurse inutile pentru a îmbunătăți încărcarea paginilor. [Află mai multe] (https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{un lanț găsit}few{# lanțuri găsite}other{# de lanțuri găsite}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Redu profunzimea solicitărilor esențiale"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Specialiștii în browsere recomandă ca paginile să conțină mai puțin de ~1.500 de noduri DOM. Ideal este ca arborele să aibă o profunzime mai mică de 32 de elemente și mai puțin de 60 de elemente principale/subordonate. Un DOM mare poate crește folosirea memoriei, poate produce [calcule de stil] (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) mai lungi și poate produce [rearanjări ale aspectului](https://developers.google.com/speed/articles/reflow). [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{un nod}few{# noduri}other{# de noduri}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Evită o dimensiune DOM excesivă"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Adâncimea DOM maximă"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Numărul total de noduri DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Evită o dimensiune DOM excesivă"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Poți folosi funcția CSS de afișare a fonturilor pentru a verifica dacă textul este vizibil pentru utilizatori în timp ce se încarcă fonturile web. [Află mai multe](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Asigură-te că textul rămâne vizibil în timpul încărcării fonturilor web"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Tot textul rămâne vizibil în timpul încărcării fonturilor web"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Categorie"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Poți reduce timpul petrecut cu analizarea, compilarea și executarea JS. Livrarea unor sarcini JS mai mici poate ajuta în acest sens."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimizează procesarea firului principal"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimizează procesarea firului principal"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Scorul de mai sus reprezintă o estimare a duratei necesare pentru ca aplicația să răspundă la comanda utilizatorului, în milisecunde, în cea mai aglomerată fereastră de 5 secunde de încărcare a paginii. Dacă latența este mai mare de 50 ms, utilizatorii îți pot percepe aplicația ca fiind lentă. [Află mai multe] (https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Latența estimată a comenzilor"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Prima redare de conținut arată momentul când se redă primul text sau prima imagine. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Prima redare de conținut"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Primul „CPU inactiv” semnalează primul moment în care firul principal al paginii este suficient de liber pentru a accepta comenzi. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Primul „CPU inactiv”"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Prima redare semnificativă arată momentul când este vizibil conținutul principal al unei pagini. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Prima redare semnificativă"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interactivitatea semnalează momentul când pagina este complet interactivă. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Timpul până la interactivitate"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Indexul de viteză arată cât de repede se completează vizibil conținutul unei pagini. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Index de viteză"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Redirecționările introduc întârzieri suplimentare înainte ca pagina să se poată încărca. [Află mai multe] (https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Evită mai multe redirecționări ale paginii"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Timpul până la primul byte identifică timpul în care serverul trimite un răspuns. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Documentul rădăcină a avut nevoie de {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Redu timpii de răspuns ai serverului (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Serverul răspunde repede (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Durată"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Nume"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Ora de începere"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tip"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Îți poți îmbunătăți aplicația cu API-ul User Timing ca să măsori performanța reală a acesteia în timpul experiențelor de utilizare principale. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{o durată a utilizării}few{# durate ale utilizărilor}other{# de durate ale utilizărilor}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Mărci și dimensiuni pentru Duratele utilizărilor"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Poți adăuga indicii de resurse de preconectare sau dns-prefetch pentru a stabili conexiuni inițiale cu originile terță parte importante. [Află mai multe](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Preconectează la originile necesare"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Poți folosi <link rel=preload> ca să acorzi prioritate preluării resurselor care sunt momentan solicitate mai târziu la încărcarea paginii. [Află mai multe](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Preîncarcă solicitările importante"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Mai multe informații despre performanța aplicației tale."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnosticare"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Cel mai important aspect al performanței este cât de repede se redau pixelii pe ecran. Valori cheie: prima redare de conținut, prima redare semnificativă"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Îmbunătățirile pentru prima redare"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Aceste optimizări pot accelera încărcarea paginii."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Oportunități"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Valori"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Îmbunătățește experiența globală de încărcare, astfel ca pagina să se afișeze și să fie gata de utilizare cât mai curând posibil. Valori cheie: timpul până la interactivitate, indexul de viteză"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Îmbunătățiri generale"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Performanță"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL cache"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Dimensiune (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Timp petrecut"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"Adresa URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Economii potențiale (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Economii potențiale (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Poți economisi {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Poți economisi {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Afișează audituri"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Navigare inițială"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Latența maximă a căii critice:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Eroare!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Eroare de raport: nu există informații de auditare"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Datele testului"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Analiza în [Lighthouse](https://developers.google.com/web/tools/lighthouse/) a paginii actuale cu o conexiune 3G emulată. Valorile sunt estimate și pot varia."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Elemente suplimentare de verificat manual"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nu se aplică"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Oportunitate"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Economii estimate"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Auditări trecute"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Scala scorului:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Au apărut probleme care au afectat această rulare Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Valorile sunt estimate și pot varia."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Avertismente: "}};
+
+
+},{}],68:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Расширения Chrome замедляют загрузку этой страницы. Попробуйте использовать режим инкогнито или профиль Chrome без расширений."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Время оценки скриптов"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Время анализа скриптов"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Всего"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Рекомендуем сократить время на анализ, компиляцию и выполнение скриптов JS. Для этого вы можете уменьшить размер фрагментов кода JS. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Сократите время выполнения кода JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Время выполнения кода JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Большие GIF-файлы – неэффективный способ представления анимации. Чтобы сэкономить трафик в сети, используйте видео в формате MPEG4/WebM для анимированного контента и изображения в формате PNG/WebP – для статического. [Подробнее…](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Используйте видеоформаты для анимированного контента"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Чтобы уменьшить время до начала взаимодействия, рекомендуем использовать принцип lazy loading для скрытых изображений после того, как все важные ресурсы будут загружены. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Отложите загрузку скрытых изображений"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Некоторые ресурсы препятствуют загрузке контента страницы. Рекомендуем настроить загрузку необходимых ресурсов JS/CSS в первую очередь и отложить загрузку остальных ресурсов. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Устраните ресурсы, блокирующие отображение"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Чрезмерная нагрузка на сеть стоит пользователям реальных денег и может стать причиной долгого ожидания при работе в Интернете. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Общий размер достиг {totalBytes, number, bytes} КБ"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Предотвратите чрезмерную нагрузку на сеть"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Предотвращение чрезмерной нагрузки на сеть"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Уменьшение CSS-файлов может сократить нагрузку на сеть. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Уменьшите размер кода CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Уменьшение файлов JavaScript может сократить размер фрагментов кода и время анализа скриптов. [Подробнее…](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Уменьшите размер кода JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Чтобы сократить расход трафика, удалите неиспользуемые правила из таблиц стилей. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Отложите загрузку неиспользуемого контента CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Чтобы сократить расход трафика, удалите неиспользуемый код JavaScript."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Удалите неиспользуемый код JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Длительное время хранения кеша может ускорить загрузку при повторных посещениях страницы. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Найден 1 ресурс}one{Найден # ресурс}few{Найдено # ресурса}many{Найдено # ресурсов}other{Найдено # ресурса}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Задайте правила эффективного использования кеша для статических объектов"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Настройка правил эффективного использования кеша для статических объектов"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Оптимизированные изображения загружаются быстрее и расходуют меньше мобильных данных. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Настройте эффективную кодировку изображений"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Чтобы сэкономить мобильные данные и ускорить загрузку, настройте подходящий размер изображений на странице. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Настройте подходящий размер изображений"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Чтобы уменьшить расход трафика в сети, рекомендуем использовать сжатие для текстовых ресурсов (gzip, deflate или brotli). [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Включите сжатие текста"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Для изображений в форматах JPEG 2000, JPEG XR и WebP используется более эффективное сжатие, поэтому они загружаются быстрее и потребляют меньше трафика, чем изображения PNG и JPEG. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Используйте современные форматы изображений"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Приведенные ниже цепочки критических запросов показывают, какие ресурсы загружаются с высоким приоритетом. Чтобы ускорить загрузку страниц, рекомендуем сократить длину цепочек, уменьшить размер скачиваемых ресурсов или отложить скачивание ненужных ресурсов. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Найдена 1 цепочка}one{Найдена # цепочка}few{Найдено # цепочки}many{Найдено # цепочек}other{Найдено # цепочки}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Сократите глубину вложенности критических запросов"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Разработчики браузеров рекомендуют, чтобы на странице было не более 1500 узлов DOM. Наилучшие показатели: глубина вложенности менее 32 элементов, количество дочерних и родительских элементов – менее 60. Сложная структура DOM может увеличить использование памяти, замедлить [вычисление стилей](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) и повысить затраты на [компоновку шаблонов](https://developers.google.com/speed/articles/reflow). [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 узел}one{# узел}few{# узла}many{# узлов}other{# узла}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Сократите размер структуры DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Максимальная глубина вложенности DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Общее количество узлов DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Сокращение размера структуры DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Чтобы пользователь мог видеть текст, пока веб-шрифты не загрузились, используйте функцию отображения шрифтов CSS. [Подробнее…](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Настройте показ всего текста во время загрузки веб-шрифтов"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Показ всего текста во время загрузки веб-шрифтов"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Категория"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Рекомендуем сократить время на анализ, компиляцию и выполнение скриптов JS. Для этого вы можете уменьшить размер фрагментов кода JS."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Минимизируйте работу в основном потоке"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Минимизация работы в основном потоке"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Это значение показывает время в миллисекундах, которое занимает реакция приложения на действия пользователя в течение самых занятых 5 с загрузки страницы. Если это время превышает 50 мс, пользователям может показаться, что ваше приложение работает с задержками. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Приблизительное время задержки при вводе"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Первая отрисовка контента – показатель, который определяет интервал времени между началом загрузки страницы и появлением первого изображения или блока текста. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Время загрузки первого контента"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Этот параметр показывается время, в которое основной поток страницы становится достаточно свободен для обработки ручного ввода. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Время окончания работы ЦП"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Этот параметр показывает время, по истечении которого становится виден основной контент страницы. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Время загрузки достаточной части контента"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Этот параметр представляет собой отметку времени, когда страница становится полностью готова к взаимодействию с пользователем. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Время загрузки для взаимодействия"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Индекс скорости загрузки показывает, насколько быстро контент страницы становится доступен для просмотра. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Индекс скорости загрузки"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Переадресация может стать причиной дополнительной задержки при загрузке страницы. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Избегайте большого количества переадресаций"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Время до получения первого байта показывает задержку, после которой с вашего сервера отправляется ответ на запрос. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Загрузка корневого документа заняла {timeInMs, number, milliseconds} мс"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Сократите время ответа сервера (время до получения первого байта)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Короткое время ответа сервера (время до получения первого байта)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Длительность"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Название"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Время начала"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Тип"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Используйте User Timing API, чтобы измерить реальную производительность своего приложения во время ключевых моментов взаимодействия с пользователями. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 временная метка}one{# временная метка}few{# временные метки}many{# временных меток}other{# временной метки}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Метки и промежутки пользовательского времени"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Чтобы быстро устанавливать соединение с необходимыми сторонними доменами, рекомендуем добавить ресурсные подсказки preconnect или dns-prefetch. [Подробнее…](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Используйте предварительное подключение к необходимым доменам"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Чтобы загружать требуемые ресурсы в порядке приоритета, вам следует использовать <link rel=предварительную загрузку>. [Подробнее…](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Настройте предварительную загрузку ключевых запросов"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Подробная информация о производительности вашего приложения."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Диагностика"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Один из самых важных параметров производительности – насколько быстро пиксели отображаются на экране. Ключевые показатели: \"Время загрузки первого контента\" и \"Время загрузки достаточной части контента\"."},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Уменьшение времени загрузки контента"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Эти действия по оптимизации могут ускорить загрузку страницы."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Оптимизация"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Показатели"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Улучшите параметры загрузки, чтобы страница была готова для работы как можно скорее. Ключевые показатели: \"Время загрузки для взаимодействия\" и \"Индекс скорости загрузки\"."},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Общие улучшения"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Производительность"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Время жизни кеша"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Размер (КБ)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Потраченное время"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Потенциальная экономия данных (КБ)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Потенциальная экономия времени (мс)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Потенциальная экономия данных: {wastedBytes, number, bytes} КБ"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Потенциальная экономия времени: {wastedMs, number, milliseconds} мс"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} мс"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} сек."},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Показать аудиты"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Начальная навигация"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Максимальная задержка критического пути:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Ошибка"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Ошибка отчета: информация аудита отсутствует"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Лабораторные данные"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Анализ [Lighthouse](https://developers.google.com/web/tools/lighthouse/) для текущей страницы в условиях эмулированной 3G-сети. Значения приблизительные и могут изменяться."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Дополнительные объекты для проверки вручную"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Неприменимо"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Возможности"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Приблизительная экономия"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Успешные аудиты"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Легенда:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Во время работы Lighthouse возникли следующие проблемы:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Значения приблизительные и могут изменяться."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Предупреждения: "}};
+
+
+},{}],69:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Rozšírenia pre Chrome negatívne ovplyvnili výkonnosť načítania tejto stránky. Skúste stránku skontrolovať v režime inkognito alebo profile Chrome bez rozšírení."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Hodnotenie skriptu"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Analýza skriptu"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Celkovo"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Zvážte skrátenie času stráveného analýzou, zostavovaním a spustením JavaScriptu. Možno vám s tým pomôže zobrazovanie menších prenášaných dát JavaScriptu. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Skráťte čas spustenia JavaScriptu"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Čas spustenia JavaScriptu"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Veľké GIFy nie sú vhodné na zobrazovanie animovaného obsahu. Namiesto nich odporúčame použiť videá MPEG4/WebM pre animácie a PNG/WebP pre statické obrázky, aby ste ušetrili spotrebu bajtov v sieti. [Ďalšie informácie](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Pre animovaný obsah použite formáty videa"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Zvážte oneskorené načítanie obrázkov, ktoré sú mimo obrazovky alebo skryté, a to až po dokončení načítania všetkých podstatných zdrojov, čím skrátite čas do interaktívneho vykreslenia. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Oddiaľte načítanie obrázkov mimo obrazovky"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Zdroje blokujú prvé vyfarbenie stránky. Zvážte zobrazovanie podstatných JavaScriptov alebo šablón CSS v texte a oddialenie všetkých nepodstatných JavaScriptov alebo štýlov. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Odstráňte zdroje blokujúce vykreslenie"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Veľké sieťové prenosy dát stoja používateľov mnoho peňazí a často sú spájané s dlhými časmi načítania. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Celková veľkosť bola {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Zabráňte nadmerným sieťovým prenosom dát"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Zabráni nadmerným sieťovým prenosom dát"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Minifikáciou súborov šablón CSS môžete znížiť veľkosti sieťových prenosov dát. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minifikujte súbory CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Minifikáciou súborov JavaScriptu môžete znížiť veľkosti prenášaných dát a čas analýzy skriptu. [Ďalšie informácie](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minifikujte JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Odstráňte nepoužívané pravidlá zo šablón štýlov a znížte tak zbytočnú spotrebu bajtov sieťovou aktivitou. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Oddiaľte nepoužívané šablóny CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Odstráňte nepoužívaný JavaScript a znížte tak spotrebu bajtov sieťovou aktivitou."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Odstráňte nepoužívaný JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Dlhá životnosť vyrovnávacej pamäte môže urýchliť opakované návštevy stránky. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Našiel sa 1 zdroj}few{Našli sa # zdroje}many{# resources found}other{Našlo sa # zdrojov}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Zobrazujte statické podklady s účinnými pravidlami ukladania do vyrovnávacej pamäte"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Používa účinné pravidlá ukladania do vyrovnávacej pamäte pre statické podklady"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimalizované obrázky sa načítavajú rýchlejšie a spotrebúvajú menej mobilných dát. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Účinne zakódujte obrázky"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Zobrazujte obrázky s primeranou veľkosťou, čím ušetríte mobilné dáta a skrátite čas načítania. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Nastavte primeranú veľkosť obrázkov"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Textové zdroje by sa mali zobrazovať komprimované (gzip, deflate alebo brotli), aby sa minimalizovala celková spotreba bajtov v sieti. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Povoľte kompresiu textu"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Formáty obrázka, napríklad JPEG 2000, JPEG XR a WebP, zvyčajne poskytujú lepšiu kompresiu než PNG alebo JPEG, čo znamená rýchlejšie sťahovanie a nižšiu spotrebu dát. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Zobrazujte obrázky vo formátoch ďalšej generácie"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Reťazce podstatných žiadostí uvedené nižšie znázorňujú, ktoré zdroje sú načítané s vysokou prioritou. Zvážte skrátenie dĺžky reťazcov, aby ste znížili veľkosť sťahovaných zdrojov, alebo odložte sťahovanie nepotrebných zdrojov, čím zlepšíte načítanie stránky. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Našiel sa 1 reťazec}few{Našli sa # reťazce}many{# chains found}other{Našlo sa # reťazcov}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minimalizujte hĺbku podstatných žiadostí"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Inžinieri prehliadača odporúčajú, aby stránky obsahovali menej ako ~1 500 uzlov DOM. Optimálna hodnota je hĺbka stromovej štruktúry menšia ako 32 prvkov a menej ako 60 podradených/nadradených prvkov. Veľký prvok DOM môže zvýšiť spotrebu pamäte, predĺžiť [výpočty štýlov](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) a spôsobiť nákladné [preformátovania rozložení](https://developers.google.com/speed/articles/reflow). [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 uzol}few{# uzle}many{# nodes}other{# uzlov}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Nepoužívajte nadmerne veľký prvok DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maximálna hĺbka prvku DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Celkový počet uzlov DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Zabráni použitiu nadmerne veľkého prvku DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Využite funkciu CSS zobrazenia písma, ktorá pomôže zaistiť, aby bol text viditeľný používateľom počas načítavania webfontov. [Ďalšie informácie](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Zaistite, aby text zostal počas načítania webfontov viditeľný"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Všetok text zostane počas načítania webfontov viditeľný"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategória"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Zvážte skrátenie času stráveného analýzou, zostavovaním a spustením JavaScriptu. Možno vám s tým pomôže zobrazovanie menších prenášaných dát JavaScriptu."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimalizujte prácu hlavného vlákna"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimalizuje prácu hlavného vlákna"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Skóre uvedené vyššie je odhadovaný čas odozvy na vstup používateľa v milisekundách počas najrušnejších 5 sekúnd načítania stránky. Ak latencia prevyšuje 50 ms, používateľom sa môžu zdať odozvy aplikácie oneskorené. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Odhadovaná latencia vstupu"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Prvé obsahové vyfarbenie označuje čas, za ktorý je vyfarbený prvý text alebo obrázok. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Prvé obsahové vyfarbenie"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Prvá nečinnosť procesora označuje, kedy je hlavné vlákno stránky prvýkrát dostatočne nečinné na spracovanie vstupu. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Prvá nečinnosť procesora"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Prvé účelné vyfarbenie meria, kedy je hlavný obsah stránky viditeľný. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Prvé účelné vyfarbenie"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interaktívne vykreslenie označuje čas, za ktorý sa stránka stane úplne interaktívnou. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Čas do interaktívneho vykreslenia"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Index rýchlosti znázorňuje, za aký čas sa viditeľne doplní obsah stránky. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Index rýchlosti"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Presmerovania spôsobujú ďalšie oneskorenia pri načítavaní stránky. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Vyhnite sa viacnásobným presmerovaniam stránky"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Čas do prvého bajtu určuje čas, za ktorý váš server odošle odpoveď. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Hlavný dokument trval {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Znížte časy odpovede servera (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Časy odozvy servera sú krátke (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Trvanie"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Názov"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Čas začatia"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Typ"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Zvážte vybavenie aplikácie rozhraním User Timing API a odmerajte tak skutočnú výkonnosť svojej aplikácie počas kľúčových dojmov používateľov. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 trvanie aktivít používateľov}few{# trvania aktivít používateľov}many{# user timings}other{# trvaní aktivít používateľov}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Značky a merania trvania aktivít používateľov"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Zvážte pridanie indikátorov zdrojov predbežného pripojenia alebo predbežného načítania DNS, ktoré vám pomôžu zriadiť predbežné pripojenia k dôležitým zdrojom tretích strán. [Ďalšie informácie](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Nastavte predbežné pripojenie k požadovaným zdrojom"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Zvážte použitie funkcie <link rel=preload>, čím uprednostníte načítanie zdrojov, o ktoré sa momentálne žiada v neskoršej fáze načítania stránky. [Ďalšie informácie](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Predbežne načítavajte kľúčové žiadosti"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Ďalšie informácie o výkonnosti vašej aplikácie"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Najpodstatnejší aspekt výkonnosti je čas, za ktorý sa pixely vykreslia na obrazovke. Kľúčové metriky: Prvé obsahové vyfarbenie, Prvé účelné vyfarbenie."},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Vylepšenia prvého vyfarbenia"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Týmito optimalizáciami môžete zrýchliť načítanie stránky."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Príležitosti"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metriky"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Vylepšite celkové načítavanie, aby bola stránka čo najskôr responzívna a pripravená na použitie. Kľúčové metriky: Čas do interaktívneho vykreslenia, Index rýchlosti"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Celkové vylepšenia"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Výkonnosť"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL vyrovnávacej pamäte"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Veľkosť (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Strávený čas"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"Webová adresa"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potenciálna úspora (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potenciálna úspora (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potenciálna úspora: {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potenciálna úspora: {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Zobraziť kontroly"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Počiatočná navigácia"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maximálna latencia cesty dôležitých žiadostí:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Chyba!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Nahlásenie chyby: žiadne informácie o kontrole"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Údaje laboratória"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Analýza aktuálnej stránky nástrojom [Lighthouse](https://developers.google.com/web/tools/lighthouse/) v emulovanom sieťovom pripojení 3G. Hodnoty sú odhadované a môžu sa líšiť."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Ďalšie položky na manuálnu kontrolu"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nehodí sa"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Príležitosti"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Odhadovaná úspora"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Absolvované kontroly"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Hodnotiaca škála:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Vyskytli sa problémy ovplyvňujúce funkčnosť nástroja Lighthouse:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Hodnoty sú odhady, ktoré sa môžu líšiť."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Upozornenia: "}};
+
+
+},{}],70:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Razširitve za Chrome so negativno vplivale na nalaganje te strani. Poskusite pregledati to stran v načinu brez beleženja zgodovine ali v profilu za Chrome brez razširitev."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Ocenjevanje skripta"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Razčlenitev skripta"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Skupno"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Razmislite o skrajšanju časa, ki ga porabite za razčlenjevanje, prevajanje in izvajanje JavaScripta. Ugotovili boste, da vam lahko pri tem pomaga dostavljanje manjših paketov koristne vsebine JavaScript. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Skrajšajte čas izvajanja JavaScripta"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Čas izvajanja JavaScripta"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Veliki GIF-i so neučinkoviti za dostavljanje animirane vsebine. Razmislite o uporabi videoposnetkov MPEG4/WebM za animacije in slik PNG/WebP za statične slike namesto GIF-ov, s čimer prihranite omrežne bajte. [Več o tem](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Uporabite oblike zapisa videoposnetkov za animirano vsebino"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Razmislite o odloženem nalaganju slik zunaj zaslona in skritih slik po dokončanem nalaganju kritičnih sredstev zaradi skrajšanja časa do interaktivnosti strani. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Odložite nalaganje slik, ki so zunaj zaslona"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Sredstva blokirajo prvo barvanje strani. Razmislite o sprotnem dostavljanju kritičnega JavaScripta/CSS-ja in odlaganju JavaScripta/slogov, ki ni oziroma niso kritični. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Izločite sredstva, ki blokirajo upodabljanje"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Veliki omrežni paketi koristne vsebine uporabnikom povzročajo dejanske stroške in so tesno povezani z dolgimi časi nalaganja. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Skupna velikost je bila {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Izogibajte se velikanskim omrežnim paketom koristne vsebine"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Izogiba se velikanskim omrežnim paketom koristne vsebine"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Z zmanjšanjem datotek CSS-ja lahko zmanjšate velikosti paketov koristne vsebine. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Zmanjšajte CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Z zmanjšanjem datotek JavaScript lahko zmanjšate velikosti paketov koristne vsebine in skrajšate čas razčlenjevanja skriptov. [Več o tem](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Pomanjšajte JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Odstranite neuporabljena pravila iz datotek s slogi, da zmanjšate število nepotrebno uporabljenih bajtov v omrežni dejavnosti. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Odložite neuporabljeni CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Odstranite neuporabljeni JavaScript, če želite zmanjšati število bajtov, uporabljenih v omrežni dejavnosti."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Odstranite neuporabljeni JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Dolgotrajno predpomnjenje lahko pospeši vnovične obiske strani. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Najdeno je bilo 1 sredstvo}one{Najdeno je bilo # sredstvo}two{Najdeni sta bili # sredstvi}few{Najdena so bila # sredstva}other{Najdenih je bilo # sredstev}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Dostavljajte statična sredstva z učinkovitim pravilnikom o predpomnjenju"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Uporaba pravilnika o učinkovitem predpomnjenju za statična sredstva"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimizirane slike se nalagajo hitreje in terjajo manj prenesenih podatkov v mobilnih omrežjih. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Učinkovito kodirajte slike"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Prikazujte slike primerne velikosti, s čimer poskrbite za prihranek prenesenih podatkov v mobilnih omrežjih in izboljšate čas nalaganja. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Uporabite slike ustrezne velikosti"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Pri dostavi besedilnih sredstev uporabite stiskanje (gzip, deflate ali brotli) zaradi zmanjšanja skupnega števila omrežnih bajtov. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Omogočite stiskanje besedila"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Oblike zapisa slik, kot so JPEG 2000, JPEG XR in WebP, pogosto omogočajo učinkovitejše stiskanje kot oblika zapisa PNG ali JPEG, kar pomeni hitrejše prenose in manjšo porabo podatkov. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Dostavljajte slike v sodobnih oblikah zapisa"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Verige kritičnih zahtev spodaj vam prikazujejo, katera sredstva so naložena z visoko prednostjo. Razmislite o skrajšanju verig, zmanjšanju velikosti sredstev ali odlaganju prenosa nepotrebnih sredstev zaradi izboljšanja nalaganja strani. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Najdena je bila 1 veriga}one{Najdena je bila # veriga}two{Najdeni sta bili # verigi}few{Najdene so bile # verige}other{Najdenih je bilo # verig}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Zmanjšajte globino kritičnih zahtev"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Inženirji za brskalnike priporočajo, da strani vsebujejo manj kot približno 1500 vozlišč DOM-a. Idealna vrednost je globina drevesa z manj kot 32 elementi in manj kot 60 podrejenimi/nadrejenimi elementi. Velik DOM lahko povzroči povečano uporabo pomnilnika, daljše [slogovne izračune](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) in drage [prilagoditve postavitve](https://developers.google.com/speed/articles/reflow). [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 vozlišče}one{# vozlišče}two{# vozlišči}few{# vozlišča}other{# vozlišč}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Izogibajte se prekomerni velikosti DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Največja globina DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Skupno število vozlišč DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Izogiba se prekomerni velikosti DOM-a"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Izkoristite funkcijo CSS-ja za prikaz pisave, s čimer poskrbite, da je med nalaganjem spletne pisave besedilo vidno uporabnikom. [Več o tem](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Poskrbite, da bo med nalaganjem spletne pisave besedilo ostalo vidno"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Vse besedilo ostaja vidno med nalaganjem spletne pisave"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorija"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Razmislite o skrajšanju časa, ki ga porabite za razčlenjevanje, prevajanje in izvajanje JavaScripta. Ugotovili boste, da vam lahko pri tem pomaga dostavljanje manjših paketov koristne vsebine JavaScript."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minimizirajte delo glavne niti"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minimizira delo glavne niti"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Zgornji rezultat je ocena, koliko milisekund potrebuje vaša aplikacija za odziv na uporabnikovo dejavnost med najaktivnejšimi 5 sekundami pri nalaganju strani. Če je zakasnitev večja od 50 ms, se lahko uporabnikom zdi, da se aplikacija zatika. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Ocenjena zakasnitev vnosa"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Prvo vsebinsko barvanje označuje čas, ko je pobarvano prvo besedilo oziroma je pobarvana prva slika. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Prvo vsebinsko barvanje"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Prva nedejavnost CPE-ja označuje čas, po katerem je glavna nit strani dovolj neobremenjena, da lahko obravnava vnos. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Prva nedejavnost CPE-ja"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Prvo smiselno barvanje meri, kdaj je vidna glavna vsebina strani. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Prvo smiselno barvanje"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interaktivnost označuje čas, po katerem je stran v celoti interaktivna. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Čas do interaktivnosti"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Indeks hitrosti prikazuje, kako hitro je vsebina strani vidno izpolnjena. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Indeks hitrosti"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Preusmeritve vnašajo dodatne zakasnitve nalaganja strani. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Izogibajte se preusmeritvam na več strani"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"»Čas do prvega bajta« navaja čas, v katerem vaš strežnik pošlje odziv. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Korenski dokument je terjal {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Skrajšajte odzivne čase strežnika (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Odzivni časi strežnika so nizki (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Trajanje"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Ime"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Začetni čas"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Vrsta"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Razmislite o uporabi API-ja za merjenje dejanskih izvedb uporabniških dogodkov (User Timing API), če želite izmeriti dejansko delovanje aplikacije med ključnimi uporabniškimi izkušnjami. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 trajanje izvedbe uporabniških dogodkov}one{# trajanje izvedbe uporabniških dogodkov}two{# trajanji izvedbe uporabniških dogodkov}few{# trajanja izvedbe uporabniških dogodkov}other{# trajanj izvedbe uporabniških dogodkov}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Oznake in merjenja trajanj izvedbe uporabniških dogodkov"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Razmislite o dodajanju namigov za sredstva za vnaprejšnje povezovanje ali vnaprejšnji prenos DNS-ja zaradi vzpostavljanja zgodnjih povezav s pomembnimi izvori tretjih oseb. [Več o tem](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Vnaprej se povežite z zahtevanimi izvori"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Razmislite o uporabi oznake <link rel=preload> za dodeljevanje višje stopnje prednosti pri pridobivanju sredstev, ki so trenutno zahtevana pri nadaljnjem nalaganju strani. [Več o tem](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Vnaprej nalagajte ključne zahteve"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Več informacij o delovanju aplikacije."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Bistveni vidik delovanja je, kako hitro se upodabljajo slikovne pike na zaslonu. Ključni meritvi: Prvo vsebinsko barvanje, Prvo smiselno barvanje"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Izboljšave prvega barvanja"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Te optimizacije lahko pospešijo nalaganje strani."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Priložnosti"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Meritve"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Izboljšajte splošno izkušnjo nalaganja, da bo stran odzivna in čim prej pripravljena na uporabo. Ključni meritvi: Čas do interaktivnosti, Indeks hitrosti"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Splošne izboljšave"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Delovanje"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL predpomnjenja"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Velikost (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Porabljeni čas"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Morebitni prihranek (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Morebitni prihranki (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"{wastedBytes, number, bytes} KB morebitnega prihranka"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"{wastedMs, number, milliseconds} ms morebitnega prihranka"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Pokaži preglede"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Začetno krmarjenje"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Največja zakasnitev kritične poti:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Napaka"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Napaka sporočila: ni podatkov o pregledu"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Laboratorijski podatki"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Analiza storitve [Lighthouse](https://developers.google.com/web/tools/lighthouse/) za trenutno stran z emulirano povezavo 3G. Vrednosti so ocenjene in lahko odstopajo."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Dodatni elementi za ročno preverjanje"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Se ne uporablja"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Priložnost"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Ocenjeni prihranek"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Uspešni pregledi"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Rezultatska lestvica:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Na to izvedbo storitve Lighthouse so vplivale težave:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Vrednosti so ocenjene in lahko odstopajo."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Opozorila: "}};
+
+
+},{}],71:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Dodaci za Chrome su negativno uticali na brzinu učitavanja ove stranice. Probajte da proverite stranicu u režimu bez arhiviranja ili sa Chrome profila bez dodataka."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Procena skripta"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Raščlanjivanje skripta"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Ukupno"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Razmislite o tome da smanjite vreme potrebno za raščlanjivanje, kompajliranje i izvršavanje JS datoteka. Prikazivanje manjih JS resursa će vam možda pomoći u tome. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Smanjite vreme izvršavanja JavaScript datoteka"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Vreme izvršavanja JavaScript-a"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Veliki GIF-ovi nisu korisni za prikazivanje animiranog sadržaja. Razmislite o tome da umesto GIF-ova koristite MPEG4/WebM video snimke za animacije i PNG/WebP za statične slike da biste uštedeli mrežne podatke. [Saznajte više](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Koristite video formate za animirani sadržaj"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Razmislite o tome da odložite učitavanje slika van ekrana i skrivenih slika dok se svi veoma važni resursi ne učitaju kako biste smanjili vreme do početka interakcije. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Odložite slike van ekrana"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Resursi blokiraju prvo prikazivanje stranice. Razmislite o tome da prikazujete sve važne JS/CSS datoteke u tekstu i da odložite sve JS datoteke/stilove koji nisu toliko važni. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Eliminišite resurse koji blokiraju prikazivanje"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Velike mrežne resurse korisnici moraju da plate stvarnim novcem i oni su veoma povezani sa dugim vremenima učitavanja. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Ukupna veličina je bila {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Izbegavajte ogromne mrežne resurse"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Izbegava ogromne mrežne resurse"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Umanjivanjem CSS datoteka možete da smanjite veličine mrežnih resursa. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Umanjite CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Umanjivanje JavaScript datoteka može da smanji veličine resursa i vreme raščlanjivanja skripta. [Saznajte više](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Umanjite JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Uklonite nekorišćena pravila iz opisa stilova da biste smanjili nepotrebnu potrošnju podataka tokom mrežnih aktivnosti. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Odložite nekorišćeni CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Uklonite nekorišćeni JavaScript da biste smanjili potrošnju podataka tokom mrežnih aktivnosti."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Uklonite nekorišćeni JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Dugo trajanje keša može da ubrza ponovne posete stranici. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Pronađen je 1 resurs}one{Pronađen je # resurs}few{Pronađena su # resursa}other{Pronađeno je # resursa}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Prikazujte statične elemente sa efikasnim smernicama keša"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Koristi efikasne smernice keša na statičnim elementima"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimizovane slike se učitavaju brže i troše manje mobilnih podataka. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Efikasno kodirajte slike"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Prikazujte slike odgovarajuće veličine da biste uštedeli mobilne podatke i poboljšali vreme učitavanja. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Odredite odgovarajuću veličinu slika"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Resurse zasnovane na tekstu treba da prikazujete u komprimovanom formatu (gzip, deflate ili brotli) da biste smanjili ukupnu količinu potrošenih mrežnih podataka. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Omogućite kompresiju teksta"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Formati slika kao što su JPEG 2000, JPEG XR i WebP često pružaju bolju kompresiju nego PNG ili JPEG, što znači brža preuzimanja i manju potrošnju podataka. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Prikazujte slike u formatima sledeće generacije"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Lanci veoma važnih zahteva u nastavku vam prikazuju koji resursi se učitavaju sa visokim prioritetom. Razmislite o tome da smanjite dužinu lanaca, da smanjite veličinu preuzimanja za resurse ili da odložite preuzimanje resursa koji nisu neophodni radi bržeg učitavanja stranice. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Pronađen je 1 lanac}one{Pronađen je # lanac}few{Pronađena su # lanca}other{Pronađeno je # lanaca}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Smanjite broj veoma važnih zahteva"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Inženjeri za pregledače preporučuju da stranice sadrže manje od približno 1500 DOM čvorova. Najbolje bi bilo da dubina stabla bude ispod 32 elementa i da ima manje od 60 podređenih/nadređenih elemenata. Veliki DOM može da poveća potrošnju memorije, da izazove duža [izračunavanja stilova](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) i da dovede do skupih [preoblikovanja izgleda](https://developers.google.com/speed/articles/reflow). [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 čvor}one{# čvor}few{# čvora}other{# čvorova}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Izbegavajte preveliku veličinu DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksimalna dubina DOM-a"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Ukupan broj DOM čvorova"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Izbegava preveliku veličinu DOM-a"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Iskoristite CSS funkciju za prikaz fontova da biste bili sigurni da korisnik može da vidi tekst dok se veb-fontovi učitavaju. [Saznajte više](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Pobrinite se da tekst ostane vidljiv tokom učitavanja veb-fontova"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Sav tekst ostaje vidljiv tokom učitavanja veb-fontova"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategorija"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Razmislite o tome da smanjite vreme potrebno za raščlanjivanje, kompajliranje i izvršavanje JS datoteka. Prikazivanje manjih JS resursa će vam možda pomoći u tome."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Smanjite rad glavne niti"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Smanjuje rad glavne niti"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Rezultat iznad je procena vremena koje je aplikaciji potrebno da odgovori na unos korisnika, u milisekundama, tokom najprometnijeg roka od 5 sekundi za učitavanje stranice. Ako je kašnjenje veće od 50 ms, korisnici će možda smatrati da aplikacija radi sporo. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Procenjeno kašnjenje unosa"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Prvo prikazivanje sadržaja označava vreme kada se prikazuju prvi tekst ili slika. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Prvo prikazivanje sadržaja"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Vreme prvog neaktivnog procesora označava prvi trenutak u kome je glavna nit stranice dovoljno neaktivna da bi obradila unos. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Vreme prvog neaktivnog procesora"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Prvo značajno prikazivanje označava vreme kada primarni sadržaj stranice postaje vidljiv. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Prvo značajno prikazivanje"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Interakcija označava vreme kada stranica postaje potpuno interaktivna. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Vreme početka interakcije"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Indeks brzine prikazuje koliko brzo sadržaj stranice postaje vidljiv za korisnike. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Indeks brzine"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Preusmeravanja dovode do dodatnih kašnjenja pre učitavanja stranice. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Izbegavajte višestruka preusmeravanja stranice"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Vreme prvog odgovora određuje vreme u koje server šalje odgovor. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Osnovnom dokumentu je trebalo {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Smanjite vremena odgovora servera (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Vremena odgovora servera su kratka (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Trajanje"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Naziv"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Vreme početka"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tip"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Razmislite o tome da opremite aplikaciju API-jem za vreme korisnika da biste izmerili učinak aplikacije u realnom svetu tokom ključnih korisničkih doživljaja. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 vreme korisnika}one{# vreme korisnika}few{# vremena korisnika}other{# vremena korisnika}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Oznake i mere Vremena korisnika"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Razmislite o tome da dodate savete za resurse za povezivanje unapred ili pripremu učitavanja DNS-a kako biste uspostavili rane veze sa važnim izvorima trećih strana. [Saznajte više](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Povežite se unapred sa potrebnim izvorima"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Razmislite o tome da koristite <link rel=preload> kako biste kasnije tokom učitavanja stranice dali prioritet preuzimanju resursa koji se trenutno traže. [Saznajte više](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Unapred učitajte najvažnije zahteve"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Više informacija o učinku aplikacije."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Dijagnostika"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Najvažniji aspekt učinka je brzina kojom se pikseli prikazuju na ekranu. Ključni pokazatelji: Prvo prikazivanje sadržaja, Prvo značajno prikazivanje"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Poboljšanja prvog prikazivanja"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Ove optimizacije mogu da ubrzaju učitavanje stranice."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Mogućnosti"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Pokazatelji"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Poboljšajte opšti doživljaj učitavanja da bi stranica počela da se odaziva i da bi bila spremna za korišćenje u najkraćem mogućem roku. Ključni pokazatelji: Vreme početka interakcije, Indeks brzine"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Opšta poboljšanja"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Učinak"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Vreme preživljavanja keša"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Veličina (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Provedeno vreme"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potencijalna ušteda (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potencijalna ušteda (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Potencijalna ušteda od {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Potencijalna ušteda od {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} sek"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Prikaži provere"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Početna navigacija"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maksimalno kašnjenje kritične putanje:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Greška!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Prijavljivanje greške: nema informacija o proveri"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Podaci o eksperimentalnim funkcijama"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analiza aktuelne stranice emulirane pomoću 3G mreže. Vrednosti su procenjene i mogu da se razlikuju."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Dodatne stavke za ručnu proveru"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Nije primenjivo"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Mogućnost"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Procenjena ušteda"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Provere sa zadovoljavajućom ocenom"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Skala rezultata:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Bilo je izvesnih problema koji su uticali na ovo pokretanje Lighthouse-a:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Vrednosti predstavljaju procene i mogu da variraju."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Upozorenja: "}};
+
+
+},{}],72:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Додаци за Chrome су негативно утицали на брзину учитавања ове странице. Пробајте да проверите страницу у режиму без архивирања или са Chrome профила без додатака."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Процена скрипта"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Рашчлањивање скрипта"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Укупно"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Размислите о томе да смањите време потребно за рашчлањивање, компајлирање и извршавање JS датотека. Приказивање мањих JS ресурса ће вам можда помоћи у томе. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Смањите време извршавања JavaScript датотека"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Време извршавања JavaScript-а"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Велики GIF-ови нису корисни за приказивање анимираног садржаја. Размислите о томе да уместо GIF-ова користите MPEG4/WebM видео снимке за анимације и PNG/WebP за статичне слике да бисте уштедели мрежне податке. [Сазнајте више](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Користите видео формате за анимирани садржај"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Размислите о томе да одложите учитавање слика ван екрана и скривених слика док се сви веома важни ресурси не учитају како бисте смањили време до почетка интеракције. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Одложите слике ван екрана"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Ресурси блокирају прво приказивање странице. Размислите о томе да приказујете све важне JS/CSS датотеке у тексту и да одложите све JS датотеке/стилове који нису толико важни. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Елиминишите ресурсе који блокирају приказивање"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Велике мрежне ресурсе корисници морају да плате стварним новцем и они су веома повезани са дугим временима учитавања. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Укупна величина је била {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Избегавајте огромне мрежне ресурсе"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Избегава огромне мрежне ресурсе"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Умањивањем CSS датотека можете да смањите величине мрежних ресурса. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Умањите CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Умањивање JavaScript датотека може да смањи величине ресурса и време рашчлањивања скрипта. [Сазнајте више](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Умањите JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Уклоните некоришћена правила из описа стилова да бисте смањили непотребну потрошњу података током мрежних активности. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Одложите некоришћени CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Уклоните некоришћени JavaScript да бисте смањили потрошњу података током мрежних активности."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Уклоните некоришћени JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Дуго трајање кеша може да убрза поновне посете страници. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Пронађен је 1 ресурс}one{Пронађен је # ресурс}few{Пронађена су # ресурса}other{Пронађено је # ресурса}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Приказујте статичне елементе са ефикасним смерницама кеша"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Користи ефикасне смернице кеша на статичним елементима"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Оптимизоване слике се учитавају брже и троше мање мобилних података. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Ефикасно кодирајте слике"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Приказујте слике одговарајуће величине да бисте уштедели мобилне податке и побољшали време учитавања. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Одредите одговарајућу величину слика"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Ресурсе засноване на тексту треба да приказујете у компримованом формату (gzip, deflate или brotli) да бисте смањили укупну количину потрошених мрежних података. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Омогућите компресију текста"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Формати слика као што су JPEG 2000, JPEG XR и WebP често пружају бољу компресију него PNG или JPEG, што значи бржа преузимања и мању потрошњу података. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Приказујте слике у форматима следеће генерације"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Ланци веома важних захтева у наставку вам приказују који ресурси се учитавају са високим приоритетом. Размислите о томе да смањите дужину ланаца, да смањите величину преузимања за ресурсе или да одложите преузимање ресурса који нису неопходни ради бржег учитавања странице. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Пронађен је 1 ланац}one{Пронађен је # ланац}few{Пронађена су # ланца}other{Пронађено је # ланаца}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Смањите број веома важних захтева"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Инжењери за прегледаче препоручују да странице садрже мање од приближно 1500 DOM чворова. Најбоље би било да дубина стабла буде испод 32 елемента и да има мање од 60 подређених/надређених елемената. Велики DOM може да повећа потрошњу меморије, да изазове дужа [израчунавања стилова](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) и да доведе до скупих [преобликовања изгледа](https://developers.google.com/speed/articles/reflow). [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 чвор}one{# чвор}few{# чвора}other{# чворова}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Избегавајте превелику величину DOM-а"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Максимална дубина DOM-а"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Укупан број DOM чворова"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Избегава превелику величину DOM-а"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Искористите CSS функцију за приказ фонтова да бисте били сигурни да корисник може да види текст док се веб-фонтови учитавају. [Сазнајте више](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Побрините се да текст остане видљив током учитавања веб-фонтова"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Сав текст остаје видљив током учитавања веб-фонтова"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Категорија"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Размислите о томе да смањите време потребно за рашчлањивање, компајлирање и извршавање JS датотека. Приказивање мањих JS ресурса ће вам можда помоћи у томе."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Смањите рад главне нити"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Смањује рад главне нити"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Резултат изнад је процена времена које је апликацији потребно да одговори на унос корисника, у милисекундама, током најпрометнијег рока од 5 секунди за учитавање странице. Ако је кашњење веће од 50 ms, корисници ће можда сматрати да апликација ради споро. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Процењено кашњење уноса"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Прво приказивање садржаја означава време када се приказују први текст или слика. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Прво приказивање садржаја"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Време првог неактивног процесора означава први тренутак у коме је главна нит странице довољно неактивна да би обрадила унос. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Време првог неактивног процесора"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Прво значајно приказивање означава време када примарни садржај странице постаје видљив. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Прво значајно приказивање"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Интеракција означава време када страница постаје потпуно интерактивна. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Време почетка интеракције"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Индекс брзине приказује колико брзо садржај странице постаје видљив за кориснике. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Индекс брзине"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Преусмеравања доводе до додатних кашњења пре учитавања странице. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Избегавајте вишеструка преусмеравања странице"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Време првог одговора одређује време у које сервер шаље одговор. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Основном документу је требало {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Смањите времена одговора сервера (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Времена одговора сервера су кратка (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Трајање"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Назив"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Време почетка"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Тип"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Размислите о томе да опремите апликацију API-јем за време корисника да бисте измерили учинак апликације у реалном свету током кључних корисничких доживљаја. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 време корисника}one{# време корисника}few{# времена корисника}other{# времена корисника}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Ознаке и мере Времена корисника"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Размислите о томе да додате савете за ресурсе за повезивање унапред или припрему учитавања DNS-а како бисте успоставили ране везе са важним изворима трећих страна. [Сазнајте више](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Повежите се унапред са потребним изворима"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Размислите о томе да користите <link rel=preload> како бисте касније током учитавања странице дали приоритет преузимању ресурса који се тренутно траже. [Сазнајте више](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Унапред учитајте најважније захтеве"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Више информација о учинку апликације."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Дијагностика"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Најважнији аспект учинка је брзина којом се пиксели приказују на екрану. Кључни показатељи: Прво приказивање садржаја, Прво значајно приказивање"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Побољшања првог приказивања"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Ове оптимизације могу да убрзају учитавање странице."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Могућности"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Показатељи"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Побољшајте општи доживљај учитавања да би страница почела да се одазива и да би била спремна за коришћење у најкраћем могућем року. Кључни показатељи: Време почетка интеракције, Индекс брзине"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Општа побољшања"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Учинак"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Време преживљавања кеша"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Величина (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Проведено време"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Потенцијална уштеда (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Потенцијална уштеда (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Потенцијална уштеда од {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Потенцијална уштеда од {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} сек"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Прикажи провере"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Почетна навигација"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Максимално кашњење критичне путање:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Грешка!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Пријављивање грешке: нема информација о провери"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Подаци о експерименталним функцијама"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) анализа актуелне странице емулиране помоћу 3G мреже. Вредности су процењене и могу да се разликују."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Додатне ставке за ручну проверу"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Није примењиво"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Могућност"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Процењена уштеда"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Провере са задовољавајућом оценом"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Скала резултата:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Било је извесних проблема који су утицали на ово покретање Lighthouse-а:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Вредности представљају процене и могу да варирају."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Упозорења: "}};
+
+
+},{}],73:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Inläsningen av den här sidan påverkas negativt av tillägg i Chrome. Testa att granska sidan i inkognitoläge eller med en Chrome-profil utan tillägg."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Utvärdering av skript"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Skriptanalys"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Totalt"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Minska tiden det tar att tolka, kompilera och köra JS-kod. Det brukar hjälpa att minska storleken på JS-resurserna som skickas. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Minska körningstiden för JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Körningstid för JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Stora GIF-bilder är ett ineffektivt sätt att visa animationer på. I stället för GIF kan du använda videor i MPEG4-/WebM-format för animationer och PNG-/WebP-format för statiska bilder, vilket minskar antalet byte som skickas via nätverket. [Läs mer](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Använd videoformat för animationer"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Låt bilder utanför skärmen och dolda bilder läsas in med lat inläsning efter att alla viktiga resurser är inlästa så att tiden till interaktivt tillstånd minskar. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Skjut upp inläsningen av bilder som inte visas på skärmen"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Den första uppritningen av sidan på skärmen blockeras av resurser. Infoga nödvändig JS-/CSS-kod direkt på sidan och skjut upp inläsningen av JS-kod/formatmallar som är mindre viktiga. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Ta bort resurser som blockerar renderingen"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Hög nätverksbelastning kostar användarna pengar och har ett starkt samband med lång inläsningstid. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Storleken totalt var {totalBytes, number, bytes} kB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Undvik enorm nätverksbelastning"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Undviker enorm nätverksbelastning"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Att minifiera CSS-filer kan minska nätverksbelastningen. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Minifiera CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Att minifiera JavaScript-filer kan minska nätverksbelastningen och tiden det tar att tolka skript. [Läs mer](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Minifiera JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Ta bort regler som inte används från formatmallarna, så att färre byte skickas via nätverket i onödan. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Skjut upp CSS som inte används"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Ta bort JavaScript som inte används så att färre byte skickas via nätverket."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Ta bort JavaScript som inte används"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Om filerna cachelagras under längre tid kan upprepade besök på sidan gå snabbare. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 resurs hittades}other{# resurser hittades}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Skicka statiska tillgångar med en effektiv cachelagringspolicy"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Använder en effektiv cachelagringspolicy för statiska tillgångar"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimerade bilder läses in snabbare och förbrukar mindre mobildata. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Koda bilder effektivt"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Minska mobildataförbrukningen och förbättra inläsningstiden genom att skicka bilder i rätt storlek. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Använd bilder med rätt storlek"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Textresurser bör skickas komprimerade (gzip, deflate eller brotli) så att färre byte skickas via nätverket. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Aktivera textkomprimering"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Bildformat som JPEG 2000, JPEG XR och WebP ger ofta bättre komprimering än PNG eller JPEG. Det gör att nedladdningen går snabbare och ger minskad dataförbrukning. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Skicka bilder i modernare bildformat"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Orderkedjorna nedan visar vilka resurser som läses in med hög prioritet. Se om du kan förbättra sidinläsningstiden genom att göra kedjorna kortare, minska storleken på resurser som laddas ned eller skjuta upp nedladdningen av onödiga resurser. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 kedja hittades}other{# kedjor hittades}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Minska antalet steg i viktiga orderkedjor"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Webbläsarutvecklare rekommenderar att en sidas DOM ska ha färre än ca 1 500 noder. Ett träd där djupet är mindre än 32 element och det finns högst 60 underordnade/överordnade element är idealiskt. Stora DOM-träd kan medföra ökad minnesförbrukning, längre [formatmallsberäkningar](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) och resurskrävande [omflödning av layouten](https://developers.google.com/speed/articles/reflow). [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 nod}other{# noder}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Undvik ett onödigt stort DOM-träd"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Största DOM-djup"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Totalt antal noder i DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Undviker ett onödigt stort DOM-träd"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Använd funktionen font-display i CSS så att texten är synlig för användaren medan webbteckensnitten läses in. [Läs mer](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Se till att all text förblir synlig medan webbteckensnitten läses in"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"All text förblir synlig medan webbteckensnitten läses in"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategori"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Minska tiden det tar att tolka, kompilera och köra JS-kod. Det brukar hjälpa att minska storleken på JS-resurserna som skickas."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Minska arbetsbelastningen på modertråden"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Minskar arbetsbelastningen på modertråden"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Värdet ovan är en uppskattning av hur lång tid (i millisekunder) det tar innan appen svarar på användarens inmatning under den mest aktiva femsekundersperioden av sidinläsningen. Om latensen är högre än 50 ms kan användarna uppfatta det som att appen laggar. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Beräknad inmatningslatens"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Första innehållsrendering anger tidpunkten när den första texten eller bilden ritades upp. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Första uppritningen av innehåll"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Första CPU-avbrottet anger tidpunkten då sidans modertråd först blev inaktiv nog att hantera indata. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Första CPU-inaktivitet"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Första meningsfulla skärmuppritningen anger när sidans primära innehåll var synligt. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Första meningsfulla skärmuppritningen"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Tiden till interaktivt tillstånd anger tidpunkten när sidan blivit helt interaktiv. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Tid till interaktivt tillstånd"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Sidans hastighetsindex visar hur snabbt sidan fylls med synligt innehåll. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Hastighetsindex"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Omdirigeringar medför en ytterligare fördröjning innan sidan kan läsas in. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Undvik upprepade omdirigeringar"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Mätvärdet Tid till första byte anger när servern svarade. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Rotdokumentet tog {timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Minska svarstiderna från servern (tid till första byte)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Servern svarar snabbt (tid till första byte)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Varaktighet"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Namn"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Starttid"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Typ"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Om du bygger in User Timing API i appen kan du mäta appens prestanda i realtid i samband med viktiga användarupplevelser. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 användartimer}other{# användartimer}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"User Timing API – tidsstämplar och mått"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Lägg till signaler för förhandsanslutning eller DNS-förhandshämtning så att viktiga anslutningar till tredje part upprättas tidigt. [Läs mer](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Föranslut till obligatoriska källor"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Prioritera upp resurser som för närvarande hämtas senare under sidinläsningen med <link rel=preload>. [Läs mer](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Läs in viktiga resurser i förväg"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Mer information om appens prestanda."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Diagnostik"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Den viktigaste delen av sidans prestanda är hur snabbt pixlarna renderas på skärmen. Viktiga mätvärden: Första uppritningen av innehåll, Första meningsfulla skärmuppritningen"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Förbättringar av första skärmuppritningen"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"De här optimeringarna kan göra inläsningen av sidan snabbare."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Möjligheter"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Mätvärden"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Förbättra inläsningstiden överlag så att sidan upplevs som responsiv och blir klar att använda så snabbt som möjligt. Viktiga mätvärden: Tid till interaktivt tillstånd, Hastighetsindex"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Övergripande förbättringar"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Prestanda"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Lagringstid i cacheminnet"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Storlek (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Tid som använts"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"Webbadress"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Möjlig databesparing (kB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Möjlig tidsbesparing (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Möjlig databesparing: {wastedBytes, number, bytes} kB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Möjlig tidsbesparing: {wastedMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} s"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Visa granskningar"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Första navigering"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Högsta latens för kritisk kedja:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Fel."},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Rapportfel: ingen granskningsinformation"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Labbdata"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/)-analys av den aktuella sidan med 3G-emulering. Värdena är uppskattningar och kan variera."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Fler saker att kolla manuellt"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Ej tillämpligt"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Möjlighet"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Uppskattad tidsbesparing"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Godkända granskningar"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Poängskala:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Problem uppstod med den här körningen av Lighthouse."},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Värdena är uppskattningar och kan variera."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Varningar: "}};
+
+
+},{}],74:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome நீட்டிப்புகள் இந்தப் பக்கத்தின் ஏற்றுதல் செயல்திறனை எதிர்மறையாகப் பாதிக்கின்றன. மறைநிலையிலோ, நீட்டிப்புகள் இல்லாத ஒரு Chrome கணக்கிலிருந்தோ பக்கத்தைத் தணிக்கை செய்ய முயலவும்."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"ஸ்கிரிப்ட் மதிப்பாய்வு"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"ஸ்கிரிப்ட் பாகுபடுத்துதல்"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"மொத்தம்"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"JSஸைப் பாகுபடுத்துதல், தொகுத்தல் மற்றும் இயக்குவதில் செலவழிக்கும் நேரத்தைக் குறைக்க முயற்சி செய்யவும். இதற்கு, சிறிய அளவிலான JS ஆதாரங்களை வழங்குவது உதவக்கூடும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"JavaScript செயல்பாட்டு நேரத்தைக் குறைக்கவும்"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript செயல்பாட்டு நேரம்"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"அனிமேஷன் செய்யப்பட்ட உள்ளடக்கத்தை வழங்குவதற்குப் பெரிய அளவிலான GIFகள் பொருத்தமானவை அல்ல. நெட்வொர்க் பைட்களைச் சேமிப்பதற்கு, GIFக்குப் பதிலாக அனிமேஷன்களுக்கு MPEG4/WebM வீடியோக்களையும் நிலையான படங்களுக்கு PNG/WebP வடிவமைப்புகளையும் பயன்படுத்தலாம். [மேலும் அறிக](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"அனிமேஷன் செய்யப்பட்ட உள்ளடக்கங்களுக்கு வீடியோ வடிவமைப்புகளைப் பயன்படுத்தவும்"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"எதிர்வினையாற்றும் நேரத்தைக் குறைப்பதற்கு, முக்கியமான அனைத்து ஆதாரங்களும் ஏற்றப்பட்ட பின்னர், திரைக்கு வெளியிலுள்ள மற்றும் மறைக்கப்பட்ட படங்களை மெதுவாக ஏற்றுமாறு அமைக்கவும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"திரைக்கு வெளியிலுள்ள படங்களைத் தவிர்க்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"ஆதாரங்கள் உங்கள் பக்கத்தின் முதல் தோற்றத்தைத் தடுக்கின்றன. முக்கிய JS/CSSஸை இன்லைனில் வழங்கவும். முக்கியமல்லாத அனைத்து JS/ஸ்டைல்களையும் தவிர்க்கவும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"ரென்டரிங்கைத் தடுக்கும் ஆதாரங்களை நீக்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"அதிகளவிலான நெட்வொர்க் ஆதாரங்கள், பயனர்களுக்குப் பண இழப்பை ஏற்படுத்துவதோடு, பக்கங்கள் ஏற்றப்பட நீண்ட நேரமாவதற்கும் காரணமாகின்றன. [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"மொத்த அளவு {totalBytes, number, bytes} கி.பை."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"அபரிமிதமான நெட்வொர்க் ஆதாரங்களைத் தவிர்க்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"அபரிமிதமான நெட்வொர்க் ஆதாரங்களைத் தவிர்க்கிறது"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"CSS கோப்புகளைச் சிறிதாக்கினால் நெட்வொர்க் ஆதாரங்களின் அளவுகள் குறையலாம். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"CSSஸைச் சிறிதாக்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"JavaScript கோப்புகளைச் சிறிதாக்கினால், ஆதாரங்களின் அளவுகளும் ஸ்கிரிப்ட் பாகுபடுத்தப்படும் நேரமும் குறையலாம். [மேலும் அறிக](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"JavaScriptடைச் சிறிதாக்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"நெட்வொர்க் செயல்பாட்டின்போது பயன்படுத்தப்படும் தேவையற்ற பைட்களைக் குறைக்க, பயன்படுத்தப்படாத விதிகளை ஸ்டைல்ஷீட்களிலிருந்து அகற்றவும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"பயன்படுத்தப்படாத CSSஸைத் தவிர்க்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"நெட்வொர்க் செயல்பாடு பயன்படுத்தும் பைட்களைக் குறைப்பதற்கு, பயன்படுத்தப்படாத JavaScriptடை அகற்றவும்."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"பயன்படுத்தப்படாத JavaScriptடை அகற்றவும்"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"தற்காலிக நினைவகத்தின் ஆயுட்காலம் நீண்டதாக இருந்தால், அது மீண்டும் மீண்டும் திறக்கப்படும் உங்கள் இணையப் பக்கங்களை விரைவாக ஏற்றக்கூடும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 ஆதாரம் கண்டறியப்பட்டது}other{# ஆதாரங்கள் கண்டறியப்பட்டன}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"திறனுள்ள தற்காலிக நினைவகக் கொள்கையுடன் நிலையான உள்ளடக்கத்தை வழங்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"நிலையான உள்ளடக்கத்தில் திறனுள்ள தற்காலிக நினைவகக் கொள்கையைப் பயன்படுத்துகிறது"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"மேம்படுத்தப்பட்ட படங்கள் மேலும் விரைவாக ஏற்றப்படுவதோடு குறைவான செல்லுலார் டேட்டாவைப் பயன்படுத்தும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"படங்களைத் திறம்பட என்கோடிங் செய்யவும்"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"செல்லுலார் டேட்டாவைச் சேமிக்கவும், பக்கத்தை விரைவாக ஏற்றவும் படங்களைச் சரியான அளவில் வழங்கவும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"படங்களைச் சரியான அளவுக்கு மாற்றவும்"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"மொத்த நெட்வொர்க் பைட்களைக் குறைப்பதற்கு, உரை அடிப்படையிலான ஆதாரங்கள் சுருக்கப்பட்டு (gzip, deflate அல்லது brotli) வழங்கப்பட வேண்டும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"உரைச் சுருக்கத்தை இயக்கவும்"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000, JPEG XR, WebP போன்ற பட வடிவமைப்புகள், PNG அல்லது JPEGயைக் காட்டிலும் சிறந்த அளவுச் சுருக்கத்தை வழங்குகின்றன, இதன் மூலம் பதிவிறக்கங்கள் வேகமாக நடைபெறும், அத்துடன் டேட்டா பயன்பாடும் குறையும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"படங்களை நவீன வடிவமைப்புகளில் வழங்கவும்"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"கீழுள்ள 'முக்கியக் கோரிக்கை வரிசைகள்', எந்தெந்த ஆதாரங்கள் உயர் முன்னுரிமையுடன் ஏற்றப்பட்டன என்பதைக் காண்பிக்கின்றன. பக்கம் ஏற்றப்படுவதன் வேகத்தை அதிகரிக்க, வரிசைகளின் நீளத்தைக் குறைத்தல், ஆதாரங்களின் பதிவிறக்க அளவைக் குறைத்தல் அல்லது தேவையற்ற ஆதாரங்களைப் பதிவிறக்குவதைத் தவிர்த்தல் போன்றவற்றை முயற்சி செய்யவும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 வரிசை கண்டறியப்பட்டது}other{# வரிசைகள் கண்டறியப்பட்டன}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"'முக்கியக் கோரிக்கைகளின் அடுக்கைக்' குறைக்கவும்"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"~1,500 DOM கணுக்களுக்குக் குறைவான கணுக்களைக் கொண்ட பக்கங்களை உலாவிப் பொறியாளர்கள் பரிந்துரைக்கின்றனர். 32 உறுப்புகளுக்குக் குறைவான கிளை அடுக்குகளும் 60க்குக் குறைவான துணைக்கிளை/கிளை உறுப்புகளும் இருப்பது உகந்தது. ஒரு பெரிய DOM, நினைவகப் பயன்பாட்டை அதிகரிக்கலாம், [ஸ்டைல் கணக்கீடுகளை] நீட்டிக்கலாம், மேலும் (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) அதிகச் செலவு பிடிக்கும் [தளவமைப்பு மறுசீராக்கங்களை] ஏற்படுத்தலாம் (https://developers.google.com/speed/articles/reflow). [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 கணு}other{# கணுக்கள்}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"அபரிமிதமான DOM அளவைத் தவிர்க்கவும்"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"அதிகபட்ச DOM கிளை அடுக்கு"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"மொத்த DOM கணுக்கள்"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"அபரிமிதமான DOM அளவைத் தவிர்க்கிறது"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"இணைய எழுத்துருக்கள் ஏற்றப்படும்போது உரை எழுத்துகள் பயனருக்குத் தெரிவதை உறுதிசெய்வதற்கு, எழுத்துருக் காட்சியின் CSS அம்சத்தைச் சேர்க்கவும். [மேலும் அறிக](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"இணைய எழுத்துரு ஏற்றப்படும்போது உரை எழுத்துகள் தெரிவதை உறுதிசெய்யவும்"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"இணைய எழுத்துருக்கள் ஏற்றப்படும்போது உரை எழுத்துகள் அனைத்தும் தெரிகின்றன"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"வகை"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"JSஸைப் பாகுபடுத்துதல், தொகுத்தல் மற்றும் இயக்குவதில் செலவழிக்கும் நேரத்தைக் குறைக்க முயற்சி செய்யவும். இதற்கு, சிறிய அளவிலான JS ஆதாரங்களை வழங்குவது உதவக்கூடும்."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"முக்கியத் தொடரிழையின் பணியைக் குறைக்கவும்"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"முக்கியத் தொடரிழையின் பணியைக் குறைக்கிறது"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"மேலுள்ள ஸ்கோர், பக்கம் ஏற்றப்படும் பிஸியான 5 வினாடி காலஅளவின்போது பயனரின் உள்ளீட்டுக்குப் பதிலளிக்க உங்கள் ஆப்ஸ் எவ்வளவு நேரம் எடுத்துக் கொள்கிறது என்பதற்கான தோராய மதிப்பாகும், இது மில்லிவினாடிகளில் கணக்கிடப்படுகிறது. பதிலளிப்பதற்கு 50 மி.வி.க்கு அதிகமாகத் தாமதமானால், பயனர்கள் உங்கள் ஆப்ஸை “மெதுவானது” என்று கருதக்கூடும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"தோராயமான உள்ளீட்டுத் தாமதம்"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"'உள்ளடக்கத்துடன் முதல் தோற்றம்' என்பது, முதல் உரை அல்லது படம் தோன்றும் நேரத்தைக் குறிக்கிறது. [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"உள்ளடக்கமுள்ள முதல் தோற்றம்"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"'CPU செயல்படாநிலையின் தொடக்க நேரம்' என்பது, உள்ளீட்டை பக்கத்தின் முக்கியத் தொடரிழை கையாள்வதற்குத் தயாராக, செயல்படாநிலையில் இருக்கும் நேரத்தின் தொடக்கத்தைக் குறிக்கிறது. [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU செயல்படாநிலையின் தொடக்க நேரம்"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"'அர்த்தமுள்ள முதல் தோற்றம்' என்பது பக்கத்தின் முதன்மை உள்ளடக்கம் எப்போது தெரிகிறது என்பதை அளவிடுகிறது. [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"அர்த்தமுள்ள முதல் தோற்றம்"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"'எதிர்வினை' என்பது பக்கம் முழுமையாக எதிர்வினையாற்றும் நேரத்தைக் குறிப்பிடுகிறது. [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"எதிர்வினை நேரம்"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"பக்கத்திலுள்ள உள்ளடக்கங்கள் எவ்வளவு விரைவாகத் தெரிகின்றன என்பதை 'வேக அட்டவணை' காண்பிக்கிறது. [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"வேக அட்டவணை"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"'திசைதிருப்புதல்கள்' பக்கம் ஏற்றப்படுவதற்கு முன்பு கூடுதல் தாமதங்களை ஏற்படுத்தலாம். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"பல பக்கங்களுக்குத் திசைதிருப்புவதைத் தவிர்க்கவும்"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"'முதல் பைட்டின் நேரம்' என்பது உங்கள் சேவையகம் ஒரு பதிலை அனுப்பும் நேரத்தைச் சுட்டிக்காட்டுகிறது. [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"மூல ஆவணம் ஏற்றப்படுவதற்கு {timeInMs, number, milliseconds} மி.வி. ஆனது"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"சேவையக எதிர்வினை நேரங்களைக் குறைக்கவும் (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"சேவையகம் எதிர்வினையாற்றும் நேரங்கள் குறைவாக உள்ளன (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"கால அளவு"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"பெயர்"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"தொடக்க நேரம்"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"வகை"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"முக்கியப் பயனர் அனுபவங்களின்போது உங்கள் ஆப்ஸின் நிகழ்நேர செயல்திறனை அளவிடுவதற்கு, உங்கள் ஆப்ஸில் User Timing APIஐப் பயன்படுத்தலாம். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 பயனர் நேரம்}other{# பயனர் நேரங்கள்}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"பயனர் நேரக் குறிப்புகளும் அளவீடுகளும்"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"முக்கியமான மூன்றாம் தரப்பு டொமைன்களுடன் விரைவான இணைப்புகளை ஏற்படுத்த, ப்ரீகனெக்ட் அல்லது dns-ப்ரீஃபெட்ச் ஆதாரக் குறிப்புகளைச் சேர்க்கலாம். [மேலும் அறிக](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"தேவைப்படும் டொமைன் பெயர்களுக்கு முன்கூட்டியே இணைப்பு வழங்கவும்"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"பக்கம் ஏற்றப்படும்போது, தற்போது பின்னர் கோரப்படும் ஆதாரங்களை முன்னதாகப் பெறுவதற்கு முன்னுரிமைப்படுத்த, <link rel=preload>ஐப் பயன்படுத்தவும். [மேலும் அறிக](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"முக்கியக் கோரிக்கைகளை முன்கூட்டியே ஏற்றவும்"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"உங்கள் ஆப்ஸின் செயல்திறன் பற்றிய மேலும் சில தகவல்கள்."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"பகுப்பாய்வு"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"திரையில் பிக்சல்கள் எவ்வளவு விரைவாக ரென்டரிங் செய்யப்படுகின்றன என்பது செயல்திறனின் மிக முக்கிய அம்சமாகும். முக்கிய அளவீடுகள்: 'உள்ளடக்கமுள்ள முதல் தோற்றம்', 'அர்த்தமுள்ள முதல் தோற்றம்'"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"முதல் தோற்ற மேம்பாடுகள்"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"இந்த மேம்படுத்ததுதல்கள் உங்கள் பக்கத்தை வேகமாக ஏற்றலாம்."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"பரிந்துரைகள்"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"அளவீடுகள்"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"ஒட்டுமொத்தமாகப் பக்கம் ஏற்றப்படும் அனுபவத்தை மேம்படுத்தவும், இதனால் பக்கம் விரைவாக எதிர்வினையாற்றும், அத்துடன் முடிந்தளவு விரைவாகப் பயன்படுத்தத் தயாராக இருக்கும். முக்கிய அளவீடுகள்: 'எதிர்வினை நேரம்', 'வேக அட்டவணை'"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"ஒட்டுமொத்த மேம்பாடுகள்"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"இணையச் செயல்திறன்"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"தற்காலிக நினைவக TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"அளவு (கி.பை.)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"செலவிட்ட நேரம்"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"தோராயமான சேமிப்பு (கி.பை.)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"தோராயமான சேமிப்புகள் (மி.வி.)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"சேமிக்கக்கூடிய அளவு: {wastedBytes, number, bytes} கி.பை."},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"சேமிக்கக்கூடிய நேரம்: {wastedMs, number, milliseconds} மி.வி."},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} மி.வி."},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} வி"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"தணிக்கைகளைக் காட்டு"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"துவக்க நெட்வொர்க் கோரிக்கை"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"முக்கியக் கோரிக்கைத் தடத்தின் அதிகபட்சத் தாமதம்:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"பிழை!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"அறிக்கைப் பிழை: தணிக்கைத் தகவல் இல்லை"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"ஆய்வகத் தரவு"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"எமுலேட்டட் 3G இல் தற்போதைய பக்கத்தின் [Lighthouse](https://developers.google.com/web/tools/lighthouse/) பகுப்பாய்வு. மதிப்புகள் தோராயமானவை, மாறுபடக்கூடியவை."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"கைமுறையாகச் சரிபார்க்க வேண்டிய கூடுதல் விஷயங்கள்"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"பொருந்தாதது"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"பரிந்துரை"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"தோராயமான சேமிப்பு"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"தேர்ச்சி பெற்ற தணிக்கைகள்"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"ஸ்கோர் அளவு:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Lighthouseஸின் இந்த இயக்கத்தைச் சில சிக்கல்கள் பாதிக்கின்றன:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"மதிப்புகள் தோராயமானவை மற்றும் மாறுபடக்கூடியவை."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"எச்சரிக்கைகள்: "}};
+
+
+},{}],75:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome ఎక్స్‌టెన్షన్‌లు ఈ పేజీ లోడ్ పనితీరును ప్రతికూలంగా ప్రభావితం చేసాయి. ఎక్స్టెన్షన్‌లు లేకుండా పేజీని అజ్ఞాత మోడ్‌లో లేదా ఎక్స్‌టెన్షన్‌లు లేని Chrome ప్రొఫైల్‌లో ఆడిట్ చేయడాన్ని ప్రయత్నించండి."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"స్క్రిప్ట్ మూల్యనిర్ధారణ"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"స్క్రిప్ట్ అన్వయింపు"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"మొత్తం"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"అన్వయించడం, సంగ్రహణ చేయడం మరియు JSను అమలు చేయడానికి వెచ్చించే సమయాన్ని తగ్గించడాన్ని పరిగణించండి. చిన్న JS పేలోడ్‌లను అందించడం ఈ విషయంలో మీకు సహాయకరంగా అనిపించవచ్చు. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"JavaScript అమలు సమయాన్ని తగ్గించండి"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript అమలు సమయం"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"యానిమేట్ చేయబడిన కంటెంట్‌ను అందించడంలో పెద్ద GIFలు సమర్థవంతంగా పనిచేయవు. నెట్‌వర్క్ బైట్‌లను పొదుపు చేయడానికి GIFకి బదులుగా యానిమేషన్ కోసం MPEG4/WebM వీడియోలను, నిశ్చల చిత్రాల కోసం PNG/WebPను ఉపయోగించడాన్ని పరిగణించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"యానిమేటెడ్ కంటెంట్ కోసం వీడియో ఫార్మాట్‌లను ఉపయోగించండి"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"పేజీలో పూర్తి పరస్పర చర్యకు పట్టే సమయం తక్కువగా ఉన్నప్పుడు అన్ని క్లిష్టమైన వనరులు లోడ్ అవ్వడం పూర్తి చేసి, ఆ తర్వాతే ఆఫ్‌స్క్రీన్ మరియు దాగి ఉన్న చిత్రాలను నెమ్మదిగా లోడ్ చేయడాన్ని పరిగణించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"ఆఫ్‌స్క్రీన్ చిత్రాలను వాయిదా వేయండి"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"వనరులు మీ పేజీ మొదటి పెయింట్‌ను బ్లాక్ చేస్తున్నాయి. క్లిష్టమైన JS/CSSలను ఇన్‌లైన్‌లో పంపించడం మరియు క్లిష్టం-కాని అన్ని JS/శైలులను తీసివేయడాన్ని పరిగణించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"రెండర్-బ్లాకింగ్ వనరులను నివారించండి"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"పెద్ద నెట్‌వర్క్ పేలోడ్‌లకు వినియోగదారులు నిజమైన డబ్బును చెల్లించాలి మరియు అవి అధికంగా సుదీర్ఘ లోడ్ సమయాలతో ముడిపడి ఉంటాయి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"మొత్తం పరిమాణం {totalBytes, number, bytes} KBగా ఉండేది"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"అతి పెద్ద నెట్‌వర్క్ పేలోడ్‌లను నివారించండి"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"అతి పెద్ద నెట్‌వర్క్ పేలోడ్‌లను నివారిస్తుంది"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"CSS ఫైల్‌లను చిన్నవిగా చేయడం నెట్‌వర్క్ పేలోడ్ పరిమాణాలను తగ్గించవచ్చు. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"CSSని చిన్నదిగా చేయండి"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"JavaScript ఫైల్‌లను చిన్నవిగా చేయడం పేలోడ్ పరిమాణాలని మరియు స్క్రిప్ట్‌ను అన్వయించడానికి పట్టే సమయాన్ని తగ్గించగలదు. [మరింత తెలుసుకోండి](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"JavaScriptను చిన్నదిగా చేయండి"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"నెట్‌వర్క్ కార్యకలాపం ఉపయోగిస్తున్న అనవసర బైట్‌లను తగ్గించడానికి శైలిషీట్‌ల నుండి ఉపయోగించని నియమాలను తీసివేయండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"ఉపయోగించని CSSను వాయిదా వేయండి"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"నెట్‌వర్క్ కార్యకలాపం వినియోగించే బైట్‌లను తగ్గించడానికి ఉపయోగించని JavaScriptను తీసివేయండి."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"ఉపయోగించని JavaScriptను తీసివేయండి"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"దీర్ఘమైన కాష్ జీవితకాలం మీ పేజీకి పునరావృత సందర్శనలను వేగవంతం చేయవచ్చు. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 వనరు కనుగొనబడింది}other{ # వనరులు కనుగొనబడ్డాయి}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"నిశ్చల ఆస్తులను సమర్ధవంతమైన కాష్ విధానంతో అందించండి"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"నిశ్చలమైన ఆస్తులపై సమర్ధవంతమైన కాష్ విధానాన్ని ఉపయోగిస్తుంది"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"ఆప్టిమైజ్ చేయబడిన చిత్రాలు త్వరగా లోడ్ అవుతాయి మరియు తక్కువ సెల్యులార్ డేటాను ఉపయోగిస్తాయి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"చిత్రాలను సమర్థవంతంగా ఎన్‌కోడ్ చేయండి"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"సెల్యులార్ డేటాను పొదుపు చేయడానికి మరియు లోడ్ సమయాన్ని మెరుగుపరచడానికి తగిన-పరిమాణానికి మార్చబడిన చిత్రాలను అందించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"చిత్రాల పరిమాణాన్ని సరిగ్గా మార్చండి"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"మొత్తం నెట్‌వర్క్ బైట్‌లను తగ్గించడానికి వచనం-ఆధారిత వనరులు ఖచ్చితంగా కుదింపు (gzip, deflate లేదా brotli)తో అందించబడాలి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"వచనం కుదింపును ప్రారంభించండి"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000, JPEG XR, మరియు WebP వంటి చిత్రం ఫార్మాట్‌లు తరచుగా PNG లేదా JPEG కంటే మెరుగైన కుదింపును అందిస్తాయి, దీనర్ధం వేగవంతమైన డౌన్‌లోడ్‌లు మరియు తక్కువ డేటా వినియోగం. [మరింత తెలుసుకోండి] (https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"చిత్రాలను తర్వాతి-తరం ఫార్మాట్‌లలో అందించండి"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"కింది క్లిష్టమైన అభ్యర్ధన గొలుసులు ఏ వనరులు అధిక ప్రాధాన్యతతో లోడ్ అయ్యాయో చూపిస్తాయి. పేజీ లోడ్‌ను మెరుగుపరచడానికి గొలుసుల పొడవును తగ్గించడం, వనరుల డౌన్‌లోడ్ పరిమాణాన్ని తగ్గించడం, లేదా అనవసర వనరులను డౌన్‌లోడ్ చేయడాన్ని వాయిదా వేయడం పరిగణించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 గొలుసు కనుగొనబడింది}other{# గొలుసులు కనుగొనబడ్డాయి}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"క్లిష్టమైన అభ్యర్ధనల గాఢత్వమును తగ్గించండి"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"పేజీలలో ~1,500 కన్నా తక్కువ DOM నోడ్‌లు ఉండాలని బ్రౌజర్ ఇంజినీర్లు సిఫార్సు చేస్తారు. ఉత్తమమైన స్థాయి < 32 అంశాల ట్రీ గాఢత మరియు 60 పిల్లలు/తల్లి/తండ్రి అంశం కన్నా తక్కువ ఉండడం. పెద్ద DOM మెమరీ వినియోగాన్ని పెంచవచ్చు, సుదీర్ఘ [శైలి గణనలు] కు దారి తీయవచ్చు (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), మరియు ఖరీదైన [లేఅవుట్ రీఫ్లోలు]ను ఉత్పత్తి చేయవచ్చు (https://developers.google.com/speed/articles/reflow). [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 నోడ్}other{# నోడ్‌లు}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"అధిక DOM పరిమాణాన్ని నివారించండి"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"DOM గరిష్ట గాఢత్వము"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"మొత్తం DOM నోడ్‌లు"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"అధిక DOM పరిమాణాన్ని నివారిస్తుంది"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"వెబ్ ఫాంట్‌లు లోడ్ అవుతున్నప్పుడు వచనం వినియోగదారుకు కనిపించేలా ఉందని నిర్ధారించుకోవడానికి ఫాంట్-ప్రదర్శన CSS ఫీచర్‌ను శక్తివంతం చేయండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"వెబ్ ఫాంట్ లోడ్ సమయంలో వచనం కనిపించేటట్లు నిర్ధారించుకోండి"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"వెబ్ ఫాంట్ లోడ్‌ల సమయంలో వచనం మొత్తం కనిపిస్తూ ఉంటుంది"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"వర్గం"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"అన్వయించడం, సంగ్రహణ చేయడం మరియు JSను అమలు చేయడానికి వెచ్చించే సమయాన్ని తగ్గించడాన్ని పరిగణించండి. చిన్న JS పేలోడ్‌లను అందించడం ఈ విషయంలో మీకు సహాయకరంగా అనిపించవచ్చు."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"ప్రధాన థ్రెడ్ పనిని తగ్గించండి"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"ప్రధాన థ్రెడ్ పనిని తగ్గిస్తుంది"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"పేజీ లోడ్‌కు అత్యంత రద్దీ అయిన 5 సెకన్ల విండో సమయంలో, వినియోగదారు ఇన్‌పుట్‌కు ప్రతిస్పందిచడానికి, మిల్లీ సెకండ్లలో, మీ యాప్ తీసుకునే సమయం యొక్క అంచనాని పైన పేర్కొన్న స్కోర్ అందిస్తుంది. మీ ప్రతి స్పందన సమయం 50మి. సె కన్నా ఎక్కువ అయితే, మీ యాప్ వేగవంతంగా పని చేయట్లేదని వినియోగదారులు భావించవచ్చు. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"అంచనా వేయబడిన ఇన్‌పుట్ ప్రతిస్పందన సమయం"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"మొదటి కంటెంట్ సహిత పెయింట్ ఏదైనా వచనం లేదా చిత్రం మొదటిసారి పెయింట్ చేయబడిన సమయాన్ని గుర్తిస్తుంది. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"మొదటి కంటెంట్ సహిత పెయింట్"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"మొదటి CPU ఖాళీ సమయం మొదటి సారిగా పేజీ యొక్క ప్రధాన థ్రెడ్ ఇన్‌పుట్‌ను నిర్వహించడానికి సరిపోయినంత ఖాళీగా ఉన్న సమయాన్ని గుర్తిస్తుంది. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU మొదటి ఖాళీ సమయం"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"మొదటి అర్ధవంతమైన పెయింట్ ఒక పేజీ ప్రాథమిక కంటెంట్ ఎప్పుడు కనిపించింది అనేదానికి ఒక కొలమానం. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"మొదటి అర్థవంతమైన పెయింట్"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"పేజీలో పూర్తి పరస్పర చర్యకు పట్టే సమయం, ఆ పేజీ పరస్పర చర్యకు పూర్తిగా సిద్దమయ్యేందుకు తీసుకున్న సమయాన్ని గుర్తిస్తుంది. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"పేజీలో పూర్తి పరస్పర చర్యకు పట్టే సమయం"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"వేగం సూచిక ఒక పేజీ కంటెంట్‌లు ఎంత వేగంగా ప్రత్యక్షంగా చూపించబడతాయో చూపిస్తుంది. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"వేగం సూచిక"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"మళ్లింపులు పేజీ లోడ్ అవ్వడానికి ముందు అదనపు ఆలస్యాలను కలగచేస్తాయి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"అనేక పేజీ మళ్లింపులను నివారించండి"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"మొదటి బైట్ సమయం మీ సర్వర్ ప్రతిస్పందనను పంపించిన సమయాన్ని గుర్తిస్తుంది. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"రూట్ పత్రం {timeInMs, number, milliseconds} మి. సె తీసుకుంది"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"సర్వర్ ప్రతిస్పందన సమయాలను తగ్గించండి (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"సర్వర్ ప్రతిస్పందన సమయాలు తక్కువగా ఉన్నాయి (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"వ్యవధి"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"పేరు"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"ప్రారంభ సమయం"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"రకం"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"కీలక వినియోగదారు అనుభవాల సమయంలో మీ యాప్ వాస్తవ ప్రపంచ పనితీరును అంచనా వేయడానికి, మీ యాప్ కోసం వినియోగదారు సమయానుకూల APIని కొలమానంగా చేసుకుని పరిశీలించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 వినియోగదారు సమయం}other{# వినియోగదారు సమయాలు}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"వినియోగదారు సమయం మార్కులు మరియు కొలమానాలు"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"ముఖ్యమైన మూడవ-పక్ష మూలాలకు ముందస్తు కనెక్ష్‌లను స్థాపించడానికి ముందుగా కనెక్ట్ చేయి లేదా dns ప్రి-ఫెచింగ్ వనరు సూచనలను జోడించడాన్ని పరిగణించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"అవసరమైన మూలాలకు ముందుగా కనెక్ట్ చేయండి"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"ప్రస్తుతం పేజీ లోడ్‌లో తర్వాత అభ్యర్ధించబడిన వనరులను పొందడాన్ని ప్రాధాన్యపరచడానికి <link rel=preload>ను ఉపయోగించడాన్ని పరిగణించండి. [మరింత తెలుసుకోండి](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"కీలక అభ్యర్ధనలను ముందుగా లోడ్ చేయండి"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"మీ అప్లికేషన్ పనితీరు గురించి మరింత సమాచారం."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"సమస్య విశ్లేషణ"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"పిక్సెల్‌లు ఎంత వేగంగా స్క్రీన్ పై ప్రదర్శింపబడతాయి అనేది పనితీరులో అతి క్లష్టమైన అంశం. కీలక గణంకాలు: మొదటి కంటెంట్ సహిత పెయింట్, మొదటి అర్ధవంతమైన పెయింట్"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"మొదటి పెయింట్ మెరుగుదలలు"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"ఈ ఆప్టిమైజేషన్‌లు మీ పేజీ లోడ్‌ అవ్వడాన్ని వేగవంతం చేయవచ్చు."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"అవకాశాలు"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"గణాంకాలు"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"పేజీ ఎంత త్వరగా వీలైతే అంత త్వరగా ప్రతిస్పందించి, ఉపయోగించడానికి సిద్దంగా ఉండడానికి, మొత్తం లోడింగ్ అనుభవాన్ని మెరుగుపరచండి. కీలక గణాంకాలు: పేజీలో పూర్తి పరస్పర చర్యకు పట్టే సమయం, వేగం సూచిక"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"మొత్తం మొరుగుదలలు"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"పనితీరు"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"కాష్ TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"పరిమాణం (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"వెచ్చించిన సమయం"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"ఆదా చేయగల పరిమాణం (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"ఆదా చేయగల వ్యవధి (మి. సె)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"ఆదా చేయగల పరిమాణం {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"ఆదా చేయగల వ్యవధి {wastedMs, number, milliseconds} మి. సెలు"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} మి. సె"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} సె"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"ఆడిట్‌లను చూపించండి"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"ప్రారంభ నావిగేషన్"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"గరిష్ట క్లిష్టమైన మార్గ ప్రతిస్పందన సమయం:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"ఎర్రర్ ఏర్పడింది!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"నివేదిక ఎర్రర్: ఆడిట్ సమాచారం లేదు"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"ల్యాబ్ డేటా"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"ఎములేటెడ్ 3Gలో ప్రస్తుత పేజీ [లైట్‌హౌస్](https://developers.google.com/web/tools/lighthouse/) విశ్లేషణ. విలువలు అంచనా ప్రకారం అందించినవి, కనుక తేడాలు ఉండవచ్చు."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"మాన్యువల్‌గా తనిఖీ చేయవలసిన అదనపు అంశాలు"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"వర్తించదు"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"అవకాశం"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"అంచనా వేసిన పొదుపులు"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"ఉత్తీర్ణత సాధించిన ఆడిట్‌లు"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"స్కోర్ స్థాయి:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Lighthouse యొక్క ఈ అమలును ప్రభావితం చేసిన సమస్యలు ఉన్నాయి:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"విలువలు అంచనా వేయబడ్డాయి మరియు మారవచ్చు."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"హెచ్చరికలు: "}};
+
+
+},{}],76:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"ส่วนขยาย Chrome ส่งผลเสียต่อประสิทธิภาพในการโหลดของหน้านี้ ลองตรวจสอบหน้าในโหมดไม่ระบุตัวตนหรือจากโปรไฟล์ Chrome ที่ไม่มีส่วนขยาย"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"การประเมินสคริปต์"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"การแยกวิเคราะห์สคริปต์"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"รวม"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"พิจารณาลดเวลาที่ใช้ในการแยกวิเคราะห์ แปลโปรแกรม และดำเนินการกับ JS การส่งเปย์โหลด JS ปริมาณน้อยอาจช่วยในเรื่องนี้ได้ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/bootup)"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"ลดเวลาในการดำเนินการกับ JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"เวลาในการดำเนินการกับ JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"GIF ขนาดใหญ่ไม่มีประสิทธิภาพในการแสดงเนื้อหาภาพเคลื่อนไหว พิจารณาใช้วิดีโอ MPEG4/WebM สำหรับภาพเคลื่อนไหวและใช้ PNG/WebP สำหรับภาพนิ่งแทน GIF เพื่อประหยัดไบต์ของเครือข่าย [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"ใช้รูปแบบวิดีโอสำหรับเนื้อหาภาพเคลื่อนไหว"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"พิจารณาโหลดรูปภาพนอกหน้าจอและรูปภาพที่ซ่อนไว้เท่าที่จำเป็นหลังจากที่ทรัพยากรที่สำคัญทั้งหมดโหลดเสร็จแล้วเพื่อลดเวลาในการโต้ตอบ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"เลื่อนเวลาโหลดรูปภาพนอกจอภาพ"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"ทรัพยากรบล็อกการแสดงผลครั้งแรกของหน้าเว็บอยู่ พิจารณาแสดง JS/CSS ที่สำคัญในหน้าและเลื่อนเวลาแสดง JS/สไตล์ที่ไม่สำคัญทั้งหมดออกไป [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"กำจัดทรัพยากรที่บล็อกการแสดงผล"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"เปย์โหลดปริมาณมากของเครือข่ายทำให้ผู้ใช้เสียค่าใช้จ่ายสูงและสัมพันธ์กับเวลาการโหลดนานเป็นอย่างมาก [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"ขนาดรวมเดิมคือ {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"หลีกเลี่ยงเปย์โหลดเครือข่ายปริมาณมาก"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"หลีกเลี่ยงเปย์โหลดเครือข่ายปริมาณมาก"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"การลดขนาดไฟล์ CSS ช่วยลดขนาดเปย์โหลดของเครือข่ายได้ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/minify-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"ลดขนาด CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"การลดขนาดไฟล์ JavaScript ช่วยลดขนาดเปย์โหลดและเวลาในการแยกวิเคราะห์สคริปต์ได้ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/speed/docs/insights/MinifyResources)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"ลดขนาด JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"นำกฎที่ไม่ได้ใช้ออกจากสไตล์ชีตเพื่อลดจำนวนไบต์ที่ไม่จำเป็นที่กิจกรรมเครือข่ายใช้ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/unused-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"เลื่อนเวลาโหลด CSS ที่ไม่ได้ใช้"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"นำ JavaScript ที่ไม่ได้ใช้ออกเพื่อลดจำนวนไบต์ที่กิจกรรมเครือข่ายใช้"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"นำ JavaScript ที่ไม่ได้ใช้ออก"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"อายุการใช้งานแคชที่ยาวนานช่วยเพิ่มการเข้าชมหน้าเว็บซ้ำได้ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{พบทรัพยากร 1 รายการ}other{พบทรัพยากร # รายการ}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"แสดงเนื้อหาคงที่ที่มีนโยบายแคชที่มีประสิทธิภาพ"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"ใช้นโยบายแคชที่มีประสิทธิภาพกับเนื้อหาคงที่"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"รูปภาพที่ได้รับการเพิ่มประสิทธิภาพจะโหลดได้เร็วขึ้นและใช้อินเทอร์เน็ตมือถือน้อยลง [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"เข้ารหัสรูปภาพอย่างมีประสิทธิภาพ"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"แสดงรูปภาพที่มีขนาดเหมาะสมเพื่อประหยัดอินเทอร์เน็ตมือถือและปรับปรุงเวลาในการโหลด [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"ปรับขนาดรูปภาพให้เหมาะสม"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"ทรัพยากรแบบข้อความควรแสดงผลโดยมีการบีบอัด (Gzip, Deflate หรือ Brotli) เพื่อลดจำนวนไบต์เครือข่ายทั้งหมด [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/text-compression)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"เปิดใช้การบีบอัดข้อความ"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"รูปแบบรูปภาพอย่างเช่น JPEG 2000, JPEG XR และ WebP มักบีบอัดได้ดีกว่า PNG หรือ JPEG ซึ่งหมายความว่าจะดาวน์โหลดได้เร็วขึ้นและใช้อินเทอร์เน็ตน้อยลง [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/webp)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"แสดงรูปภาพในรูปแบบสมัยใหม่"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"ห่วงโซ่คำขอที่สำคัญด้านล่างแสดงให้เห็นทรัพยากรที่โหลดโดยมีลำดับความสำคัญสูง พิจารณาลดความยาวของห่วงโซ่ ลดขนาดการดาวน์โหลดของทรัพยากร หรือเลื่อนเวลาการดาวน์โหลดทรัพยากรที่ไม่จำเป็นเพื่อปรับปรุงการโหลดหน้าเว็บ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)"},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{พบห่วงโซ่ 1 รายการ}other{พบห่วงโซ่ # รายการ}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"ลดความลึกของคำขอที่สำคัญ"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"วิศวกรเบราว์เซอร์แนะนำให้ใช้หน้าเว็บที่มีโหนด DOM น้อยกว่าประมาณ 1,500 รายการ ความลึกที่เหมาะที่สุดคือแบบต้นไม้ซึ่งมีองค์ประกอบน้อยกว่า 32 รายการและมีองค์ประกอบย่อย/หลักน้อยกว่า 60 รายการ DOM ขนาดใหญ่อาจใช้หน่วยความจำเพิ่มขึ้น ทำให้[การคำนวณสไตล์](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations)ยาวนานขึ้น และสร้าง[การจัดเรียงการออกแบบใหม่](https://developers.google.com/speed/articles/reflow)ที่ต้องใช้ค่าใช้จ่ายสูง [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/dom-size)"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 โหนด}other{# โหนด}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"หลีกเลี่ยง DOM ที่มีขนาดใหญ่เกินไป"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"ความลึก DOM สูงสุด"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"โหนด DOM ทั้งหมด"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"หลีกเลี่ยง DOM ที่มีขนาดใหญ่เกินไป"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"ใช้ประโยชน์จากฟีเจอร์ CSS สำหรับแสดงแบบอักษรเพื่อให้ผู้ใช้มองเห็นข้อความได้ในขณะที่กำลังโหลดเว็บฟอนต์ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/updates/2016/02/font-display)"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"ตรวจสอบว่าข้อความจะยังมองเห็นได้ในระหว่างการโหลดเว็บฟอนต์"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"ข้อความทั้งหมดจะยังมองเห็นได้ในระหว่างการโหลดเว็บฟอนต์"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"หมวดหมู่"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"พิจารณาลดเวลาที่ใช้ในการแยกวิเคราะห์ แปลโปรแกรม และดำเนินการกับ JS การส่งเปย์โหลด JS ปริมาณน้อยอาจช่วยในเรื่องนี้ได้"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"ลดการทำงานของเธรดหลัก"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"ลดการทำงานของเธรดหลัก"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"คะแนนข้างต้นเป็นระยะเวลาโดยประมาณที่แอปใช้เพื่อตอบสนองอินพุตของผู้ใช้ระหว่างการโหลดหน้าเว็บในกรอบเวลา 5 วินาทีที่ทำงานหนักที่สุด มีหน่วยเป็นมิลลิวินาที หากเวลาในการตอบสนองนานกว่า 50 มิลลิวินาที ผู้ใช้อาจรู้สึกว่าแอปช้า [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"เวลาในการตอบสนองต่ออินพุตโดยประมาณ"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"First Contentful Paint ระบุเวลาที่มีการแสดงผลข้อความหรือรูปภาพครั้งแรก [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"การแสดงผลที่มีเนื้อหาเต็มครั้งแรก"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"CPU ไม่ได้ใช้งานครั้งแรกระบุครั้งแรกที่เธรดหลักของหน้าเว็บว่างพอที่จะจัดการกับอินพุต [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU ไม่ได้ใช้งานครั้งแรก"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"การแสดงผลที่มีความหมายครั้งแรกวัดเมื่อเนื้อหาหลักของหน้าเว็บปรากฏ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"การแสดงผลที่มีความหมายครั้งแรก"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"การโต้ตอบระบุเวลาที่หน้าเว็บโต้ตอบได้อย่างสมบูรณ์ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"เวลาในการโต้ตอบ"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"ดัชนีความเร็วแสดงให้เห็นความเร็วที่เนื้อหาของหน้าปรากฏจนดูสมบูรณ์ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/speed-index)"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"ดัชนีความเร็ว"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"การเปลี่ยนเส้นทางทำให้เกิดความล่าช้ามากขึ้นก่อนที่หน้าเว็บจะโหลดได้ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/redirects)"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"หลีกเลี่ยงการเปลี่ยนเส้นทางหลายหน้า"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"เวลาที่ใช้ไบต์แรกระบุเวลาที่เซิร์ฟเวอร์ส่งการตอบกลับ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/ttfb)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"เอกสารรากใช้เวลา {timeInMs, number, milliseconds} มิลลิวินาที"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"ลดเวลาในการตอบกลับของเซิร์ฟเวอร์ (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"เวลาตอบสนองของเซิร์ฟเวอร์ต่ำ (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"ระยะเวลา"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"ชื่อ"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"เวลาเริ่มต้น"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"ประเภท"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"พิจารณาติดตั้ง User Timing API ในแอปเพื่อวัดประสิทธิภาพในระหว่างประสบการณ์สำคัญของผู้ใช้ในชีวิตจริงได้ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/user-timing)"},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{ระยะเวลาของผู้ใช้ 1 รายการ}other{ระยะเวลาของผู้ใช้ # รายการ}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"ระยะเวลาที่เจาะจงของผู้ใช้และระยะเวลาทั่วไป"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"พิจารณาเพิ่มการเชื่อมต่อล่วงหน้าหรือดึงข้อมูล DNS ล่วงหน้าสำหรับการเปลี่ยนแปลงทรัพยากรเพื่อสร้างการเชื่อมต่อกับต้นทางที่สำคัญของบุคคลที่สามตั้งแต่เนิ่นๆ [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"เชื่อมต่อกับต้นทางที่จำเป็นล่วงหน้า"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"พิจารณาใช้ <link rel=preload> เพื่อจัดลำดับความสำคัญในการเรียกทรัพยากรที่มีการขอให้โหลดหน้าเว็บภายหลัง [ดูข้อมูลเพิ่มเติม](https://developers.google.com/web/tools/lighthouse/audits/preload)"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"โหลดคำขอสำคัญล่วงหน้า"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"ข้อมูลเพิ่มเติมเกี่ยวกับประสิทธิภาพของแอปพลิเคชัน"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"การวินิจฉัย"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"ประสิทธิภาพที่สำคัญที่สุดคือความเร็วที่พิกเซลแสดงผลในหน้าจอ เมตริกที่สำคัญ ได้แก่ การแสดงผลที่มีเนื้อหาเต็มครั้งแรก การแสดงผลที่มีความหมายครั้งแรก"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"การปรับปรุงการแสดงผลครั้งแรก"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"การเพิ่มประสิทธิภาพเหล่านี้เพิ่มความเร็วในการโหลดหน้าเว็บได้"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"โอกาส"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"เมตริก"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"ปรับปรุงประสบการณ์ในการโหลดโดยรวมเพื่อให้หน้าเว็บตอบสนองและพร้อมใช้งานโดยเร็วที่สุด เมตริกที่สำคัญ ได้แก่ เวลาในการโต้ตอบ ดัชนีความเร็ว"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"การปรับปรุงโดยรวม"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"ประสิทธิภาพ"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"แคช TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"ขนาด (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"เวลาที่ใช้"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"ไบต์ที่อาจประหยัดได้ (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"เวลาที่อาจประหยัดได้ (มิลลิวินาที)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"อาจประหยัดได้ {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"อาจประหยัดเวลาได้ {wastedMs, number, milliseconds} มิลลิวินาที"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} มิลลิวินาที"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} วินาที"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"แสดงการตรวจสอบ"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"การนำทางเริ่มต้น"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"เวลาในการตอบสนองของเส้นทางสำคัญที่ยาวที่สุด"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"ข้อผิดพลาด!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"ข้อผิดพลาดในรายงาน: ไม่มีข้อมูลการตรวจสอบ"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"ข้อมูลในห้องทดลอง"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) การวิเคราะห์หน้าปัจจุบันบน 3G จำลอง ค่าต่างๆ เป็นค่าประมาณและอาจแตกต่างกันไป"},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"รายการเพิ่มเติมที่ควรตรวจสอบด้วยตนเอง"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"ไม่เกี่ยวข้อง"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"โอกาส"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"เวลาที่ประหยัดได้โดยประมาณ"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"การตรวจสอบที่ผ่านแล้ว"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"ระดับคะแนน"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"เกิดปัญหาที่มีผลต่อการทำงานนี้ของ Lighthouse"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"ค่ามาจากการประมาณและอาจแตกต่างกันไป"},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"คำเตือน "}};
+
+
+},{}],77:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome uzantıları bu sayfanın yükleme performansını olumsuz etkilemiştir. Sayfayı gizli modda veya uzantı içermeyen bir Chrome profilinden denetlemeyi deneyin."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Komut Dosyası Değerlendirmesi"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Komut Dosyası Ayrıştırma"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Toplam"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"JS'yi ayrıştırma, derleme ve yürütme için harcanan zamanı azaltma seçeneğini değerlendirin. Daha küçük JS yüklerinin sağlanmasının bu konuda yardımcı olduğunu fark edebilirsiniz. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"JavaScript yürütme süresini azaltın"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript yürütme süresi"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Büyük GIF'ler, animasyonlu içeriğin sunulmasında verimli olmaz. Ağ veri miktarından tasarruf etmek üzere animasyonlar için MPEG4/WebM videoları ve statik resimler için GIF yerine PNG/WebP kullanma seçeneğini değerlendirin. [Daha fazla bilgi](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Animasyonlu içerik için video biçimleri kullanın"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Etkileşimli hale gelme süresini kısaltmak için ekran dışındaki ve gizli resimleri, tüm kritik kaynakların yüklenmesi bittikten sonra gecikmeli olarak yükleme seçeneğini değerlendirin. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Ekran dışındaki resimleri ertele"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Kaynaklar, sayfanızda ilk boyayı engelliyor. Kritik JS/CSS'yi satır içinde yayınlama ve kritik olmayan tüm JS/stilleri erteleme seçeneğini değerlendirin. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Oluşturmayı engelleyen kaynakları ortadan kaldırın"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Büyük ağ yüklerinin kullanıcılara maddi anlamda maliyeti vardır ve bu ağ yükleri, uzun yükleme süreleriyle yakından ilişkilidir. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Toplam boyut: {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Çok büyük ağ yüklerinden kaçının"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Çok büyük ağ yüklerini önler"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"CSS dosyalarının küçültülmesi ağ yükü boyutlarını azaltabilir. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"CSS'yi küçültün"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"JavaScript dosyalarının küçültülmesi yük boyutlarını azaltabilir ve komut dosyası ayrıştırma süresini kısaltabilir. [Daha fazla bilgi](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"JavaScript'i küçült"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Ağ etkinliğiyle tüketilen gereksiz bayt sayısını azaltmak için kullanılmayan kuralları stil sayfalarından kaldırın. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Kullanılmayan CSS'yi erteleyin"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Ağ etkinliğinin kullandığı bayt sayısını azaltmak için kullanılmayan JavaScript'i kaldırın."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Kullanılmayan JavaScript'i kaldırın"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Uzun önbellek ömrü, sayfanızın tekrar ziyaret edilmesi sürecini hızlandırabilir. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{1 kaynak bulundu}other{# kaynak bulundu}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Statik öğeleri verimli bir önbellek politikasıyla yayınlayın"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Statik öğelerde verimli önbellek politikası kullanır"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Optimize edilmiş resimler daha hızlı yüklenir ve daha az hücresel veri kullanır. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Resimleri verimli bir şekilde kodlayın"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Hücresel veriden tasarruf etmek ve yükleme süresini iyileştirmek için uygun boyutlu resimler sunun. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Doğru boyuta sahip resimler"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Metne dayalı kaynaklar, toplam ağ baytı sayısını en aza indirmek için sıkıştırılarak (gizp, deflate veya brotli) yayınlanmalıdır. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Metin sıkıştırmayı etkinleştirin"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000, JPEG XR ve WebP gibi resim biçimleri genellikle PNG veya JPEG'den daha iyi sıkıştırma sağlar. Böylece indirme işlemleri daha hızlı tamamlanır ve veri tüketimi daha az olur. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Resimleri yeni nesil biçimlerde yayınlayın"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Aşağıdaki Kritik İstek Zincirleri, hangi kaynakların yüksek öncelikle yüklendiğini göstermektedir. Sayfa yüklemesini iyileştirmek için zincir uzunluğunu azaltma, kaynakların indirme boyutunu küçültme veya gereksiz kaynakların indirilmesini erteleme seçeneğini değerlendirin. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{1 zincir bulundu}other{# zincir bulundu}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Kritik İsteklerin Derinliğini En Aza İndirin"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Tarayıcı mühendisleri, sayfaların yaklaşık olarak 1500'den az DOM düğümü içermesini önerir. En etkili nokta, 32 öğeden ve 60 alt/üst öğeden az olan bir ağaç derinliğidir. Büyük bir DOM, bellek kullanımını artırarak daha uzun [stil hesaplamalarına] (https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) yol açabilir ve yüksek maliyetli [düzen yeniden düzenlemeleri](https://developers.google.com/speed/articles/reflow) oluşturabilir. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 düğüm}other{# düğüm}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Aşırı büyük bir DOM boyutundan kaçının"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Maksimum DOM Derinliği"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Toplam DOM Düğümü"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Aşırı büyük bir DOM boyutunu önler"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Web yazı tipleri yüklenirken kullanıcının metni görebilmesini sağlamak için yazı tipi görüntüleme CSS özelliğinden yararlanın. [Daha fazla bilgi](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Web yazı tipi yüklemesi sırasında metnin görünür halde kalmasını sağlayın"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Web yazı tipi yüklenirken tüm metin görünür halde kalır"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Kategori"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"JS'yi ayrıştırma, derleme ve yürütme için harcanan zamanı kısaltma seçeneğini değerlendirin. Daha küçük JS yüklerinin sağlanması bu konuda yardımcı olabilir."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Ana iş parçacığı çalışmasını en aza indir"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Ana iş parçacığının çalışmasını en aza indirir"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Yukarıdaki puan, sayfa yüklemesinin en yoğun olduğu 5 saniyelik zaman aralığında uygulamanızın kullanıcı girişine kaç milisaniye içinde yanıt vereceğine dair bir tahmindir. Gecikmeniz 50 ms'nin üzerinde olursa kullanıcılar uygulamanızın durakladığını düşünebilir. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Tahmini Giriş Gecikmesi"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"İlk Zengin İçerikli Boyama, ilk metnin veya resmin boyandığı zamanı işaret eder. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"İlk Zengin İçerikli Boya"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"İlk CPU Boşta metriği, sayfanın ana iş parçacığının girişi işlemek için yeterli olduğu ilk anı işaret eder. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"İlk CPU Boşta"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"İlk Anlamlı Boya, bir sayfanın ana içeriğinin ne zaman görünür hale geldiğini ölçer. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"İlk Anlamlı Boya"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Etkileşimli metriği, sayfanın tam olarak etkileşimli hale gelme süresini işaret eder. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Etkileşim Süresi"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Hız İndeksi, bir sayfa içeriğinin görsel olarak ne kadar hızlı doldurulabildiğini gösterir. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Hız İndeksi"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Yönlendirmeler, sayfanın yüklenmesinden önce ek gecikmelere neden olur. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Birden çok sayfa yönlendirmesini önleyin"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"İlk Bayt Zamanı, sunucunuzun bir yanıt gönderme zamanını tanımlar. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Root dokümanı {timeInMs, number, milliseconds} ms sürdü"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Sunucu yanıt sürelerini kısaltın (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Sunucu yanıt süreleri düşük (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Süre"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Ad"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Başlangıç Zamanı"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Tür"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Önemli kullanıcı deneyimleri esnasında uygulamanızın gerçek dünya performansını ölçmek için uygulamanıza User Timing API'si ekleme seçeneğini değerlendirin. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 kullanıcı zamanlaması}other{# kullanıcı zamanlaması}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Kullanıcı Zamanlaması işaretleri ve ölçüleri"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Önemli üçüncü taraf kaynaklarına erken bağlantılar oluşturmak için önceden bağlanma veya DNS önceden getirme kaynak ipuçları ekleme seçeneğini değerlendirin. [Daha fazla bilgi](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Gerekli kaynaklara önceden bağlan"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Şu anda istenen kaynakları sayfa yüklemenin sonraki aşamalarında getirmeye öncelik tanımak için <link rel=preload> öğesini kullanma seçeneğini değerlendirin. [Daha fazla bilgi](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Önemli istekleri önceden yükleyin"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Uygulamanızın performansı hakkında daha fazla bilgi."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Teşhis"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Performansın en kritik unsuru, piksellerin ekranda oluşturulma hızıdır. Önemli metrikler: İlk Zengin İçerikli Boya, İlk Anlamlı Boya"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"İlk Boya İyileştirmeleri"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Bu optimizasyonlar, sayfanızın yüklenmesini hızlandırabilir."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Fırsatlar"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Metrikler"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Toplam yükleme deneyimini geliştirerek sayfanın mümkün olan en kısa sürede duyarlı ve kullanıma hazır olmasını sağlayın. Önemli metrikler: Etkileşim Süresi, Hız İndeksi"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Toplam İyileştirmeler"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Performans"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL'yi Önbelleğe Alma"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Boyut (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Harcanan Süre"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Potansiyel Tasarruflar (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Potansiyel Tasarruf (ms)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"{wastedBytes, number, bytes} KB potansiyel tasarruf"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"{wastedMs, number, milliseconds} ms potansiyel tasarruf"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} ms"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} sn."},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Denetimleri göster"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"İlk Gezinme"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Maksimum kritik yol gecikmesi:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Hata!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Bildirme hatası: denetim bilgisi yok"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Test Verileri"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Mevcut sayfanın 3G kullanılarak gerçekleştirilen [Lighthouse](https://developers.google.com/web/tools/lighthouse/) analizi. Değerler tahmini olup değişiklik gösterebilir."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Manuel olarak kontrol edilecek ek öğeler"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Geçerli değil"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Fırsat"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Tahmini Tasarruf Miktarı"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Başarılı denetimler"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Puan ölçeği:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Şu Lighthouse çalışmasını etkileyen sorunlar vardı:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Değerler tahminidir ve değişiklik gösterebilir."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Uyarılar: "}};
+
+
+},{}],78:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Розширення Chrome негативно впливають на завантаження цієї сторінки. Спробуйте перевірити сторінку в режимі анонімного перегляду або в профілі Chrome без розширень."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Оцінка сценарію"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Синтаксичний аналіз сценарію"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Усього"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Радимо зменшити час синтаксичного аналізу, компілювання й запуску сценаріїв JavaScript. Завантажувати менші обсяги даних JavaScript може бути корисно. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Зменште час виконання JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Час виконання JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Великі файли GIF неефективні для передавання анімованого вмісту. Щоб заощадити байти мережі, радимо замість формату GIF використовувати MPEG4 або WebM для анімацій і PNG чи WebP для статичних зображень. [Докладніше](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Використовуйте формати відео для анімованого вмісту"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Щоб пришвидшити взаємодію, використовуйте закадрові й приховані зображення, коли завантажаться всі важливі ресурси. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Відкладіть закадрові зображення"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Ресурси блокують перше відображення сторінки. Вбудовуйте важливі файли JavaScript або CSS і відкладайте всі некритичні файли JavaScript чи стилі. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Вилучіть ресурси, які блокують відображення"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Великі обсяги мережевих даних дорогі для користувачів і довго завантажуються. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Загальний розмір – {totalBytes, number, bytes} KБ"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Уникайте великих обсягів даних у мережі"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Уникається великий обсяг даних мережі"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Стиснення файлів CSS може зменшити обсяг даних у мережі. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Зменште СSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Стиснення файлів JavaScript може зменшити обсяг даних і час синтаксичного аналізу сценарію. [Докладніше](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Зменште файл JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Видаліть із таблиць стилів правила, які ви не використовуєте, щоб зменшити кількість зайвих байтів під час активності в мережі. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Відкладіть вміст CSS, який не використовується"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Видаліть файли JavaScript, які ви не використовуєте, щоб зменшити кількість байтів під час активності в мережі."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Вилучіть файли JavaScript, які ви не використовуєте"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Збереження кешу за довгий час може пришвидшити завантаження сторінки під час повторних відвідувань. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Знайдено 1 ресурс}one{Знайдено # ресурс}few{Знайдено # ресурси}many{Знайдено # ресурсів}other{Знайдено # ресурсу}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Показуйте статичні об’єкти за допомогою ефективних правил кешування"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Використовуються ефективні правила кешування статичних об’єктів"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Оптимізовані зображення завантажуються швидше й використовують менше мобільного трафіку. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Ефективно кодуйте зображення"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Показуйте зображення правильного розміру, щоб заощадити мобільний трафік і покращити час завантаження. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Правильно виберіть розмір зображень"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Текстові ресурси потрібно відображати зі стисненням (Gzip, Deflate чи Brotli), щоб мінімізувати загальну кількість байтів у мережі. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Увімкніть стиснення тексту"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Формати зображень JPEG 2000, JPEG XR і WebP часто краще стискаються, ніж PNG чи JPEG. Тому вони швидше завантажуються й використовують менше даних. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Показуйте зображення в нових форматах"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Ланцюжки важливих запитів нижче показують, які ресурси мають високий пріоритет. Щоб пришвидшити завантаження сторінки, зменште довжину ланцюжків і розмір завантажень або відкладіть завантаження непотрібних ресурсів. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Знайдено 1 ланцюжок}one{Знайдено # ланцюжок}few{Знайдено # ланцюжки}many{Знайдено # ланцюжків}other{Знайдено # ланцюжка}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Мінімізуйте глибину важливих запитів"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Розробники веб-переглядачів радять, щоб сторінки містили до ~1500 вузлів DOM. Зона найкращого сприйняття – глибина дерева < 32 елементів і до 60 дитячих чи батьківських елементів. Великий файл DOM може збільшувати використання пам’яті, спричиняти довше [обчислення стилів](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) і створювати дороге [перекомпонування макетів](https://developers.google.com/speed/articles/reflow). [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 вузол}one{# вузол}few{# вузли}many{# вузлів}other{# вузла}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Уникайте надмірного розміру DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Максимальна глибина DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Загальна кількість вузлів DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Уникається надмірний розмір DOM"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Використовуйте функцію відображення шрифтів CSS, щоб текст було видно під час завантаження шрифтів. [Докладніше](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Переконайтеся, що текст залишається видимим під час завантаження веб-шрифту"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Увесь текст залишається видимим під час завантаження веб-шрифтів"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Категорія"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Зменште час виконання синтаксичного аналізу, компілювання й запуску сценаріїв JavaScript. Завантажувати менші обсяги даних JavaScript може бути корисно."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Мінімізуйте роботу основного потоку"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Мінімізується робота основного потоку"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Результат вище показує, скільки часу в мілісекундах додаток відповідає на ввід користувача під час п’ятисекундного періоду завантаження сторінки. Якщо затримка перевищує 50 мс, користувачі можуть вважати ваш додаток повільним. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Приблизна затримка введення"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Час завантаження першого вмісту показує, коли з’являється текст чи зображення. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Перше відображення всього вмісту"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Перший простій ЦП вказує, коли основний ланцюжок сторінки вперше може обробити введення. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"Перший простій ЦП"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Перше значне відображення вказує, коли видно основний вміст сторінки. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Перше значне відображення"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Показник взаємодії позначає час повної активності сторінки. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Час до повної взаємодії"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Індекс швидкості показує, через скільки часу відображається вміст сторінки. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Індекс швидкості"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Переспрямування додають затримки під час завантаження сторінки. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Уникайте переспрямувань кількох сторінок"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Час до першого байта визначає швидкість реакції сервера. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Кореневий документ відповів через {timeInMs, number, milliseconds} мс"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Зменште час відповіді сервера (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Сервер довго відповідає (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Тривалість"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Назва"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Час початку"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Тип"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Використовуйте в додатку User Timing API, щоб отримувати показники ефективності додатка під час взаємодії з користувачами. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 позначка часу користувача}one{# позначка часу користувача}few{# позначки часу користувача}many{# позначок часу користувача}other{# позначки часу користувача}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Показники й мітки часу користувача"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Додайте в ресурси корективи для попереднього з’єднання чи виклику DNS, щоб заздалегідь установлювати з’єднання з важливими джерелами третіх сторін. [Докладніше](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Попередньо під’єднуйтеся до потрібних джерел"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Використовуйте <link rel=preload>, щоб указати пріоритетність завантаження ресурсів, які наразі запитуються пізніше під час завантаження сторінки. [Докладніше](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Попередньо завантажуйте основні запити"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Докладніше про ефективність додатка."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Діагностика"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Найважливішим аспектом ефективності є швидкість відображення пікселів на екрані. Основні показники: перше відображення вмісту, перше значне відображення"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Покращення першого відображення"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Ці оптимізації можуть пришвидшити завантаження сторінки."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Можливості"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Показники"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Покращте загальну ефективність завантаження, щоб сторінка швидко реагувала й завантажувалася. Основні показники: час до повної взаємодії, індекс швидкості"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Загальні покращення"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Ефективність"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"TTL кешу"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Розмір (КБ)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Витрачений час"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL-адреса"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Потенційне заощадження (КБ)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Потенційне заощадження (мс)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Потенційне заощадження – {wastedBytes, number, bytes} КБ"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Потенційне заощадження – {wastedMs, number, milliseconds} мс"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} мс"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} c"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Показати перевірки"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Початкова навігація"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Максимальна критична затримка шляху:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Помилка."},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Повідомлення про помилку: немає інформації про перевірку"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Дані тестів"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Аналіз [Lighthouse](https://developers.google.com/web/tools/lighthouse/) поточної сторінки в імітованій мережі 3G. Значення приблизні й можуть відрізнятися."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Додаткові елементи, які потрібно перевірити вручну"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Не застосовуються"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Можливість"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Приблизне заощадження"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Виконані перевірки"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Шкала результатів:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Під час запуску Lighthouse виникли перелічені нижче проблеми."},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Значення приблизні й можуть відрізнятися."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Застереження. "}};
+
+
+},{}],79:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Các tiện ích của Chrome ảnh hưởng tiêu cực đến hiệu suất tải của trang này. Hãy thử kiểm tra trang ở chế độ ẩn danh hoặc từ một hồ sơ trên Chrome không có tiện ích."},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"Đánh giá tập lệnh"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"Phân tích cú pháp tập lệnh"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"Tổng"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"Hãy xem xét giảm thời gian dùng để phân tích cú pháp, biên soạn và thực thi JS. Bạn có thể giải quyết vấn đề này bằng cách phân phối các tải trọng JS nhỏ hơn. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/bootup)."},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"Giảm thời gian thực thi JavaScript"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"Thời gian thực thi JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"Các ảnh GIF lớn không hiệu quả trong việc phân phối nội dung động. Hãy xem xét sử dụng video MPEG4/WebM cho ảnh động và PNG/WebP cho ảnh tĩnh thay vì ảnh GIF để tiết kiệm dữ liệu mạng (số byte mạng). [Tìm hiểu thêm](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"Sử dụng các định dạng video cho nội dung động"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"Xem xét trì hoãn tải các hình ảnh ẩn và ngoài màn hình sau khi tất cả tài nguyên quan trọng tải xong để giảm thời gian tương tác. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)."},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"Trì hoãn tải các hình ảnh ngoài màn hình"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"Các tài nguyên đang chặn hình ảnh đầu tiên trang của bạn. Hãy xem xét phân phối nội dòng JS/CSS quan trọng và trì hoãn mọi JS/kiểu không quan trọng. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)."},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"Loại bỏ các tài nguyên chặn hiển thị"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"Tải trọng mạng lớn gây tốn tiền cho người dùng và thường dẫn đến thời gian tải lâu. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)."},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"Tổng kích thước là {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"Tránh các tài nguyên lớn trên mạng"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"Tránh tài nguyên lớn trên mạng"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"Việc giảm kích thước tệp CSS có thể giảm kích thước tài nguyên trên mạng. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/minify-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"Rút gọn CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"Việc giảm kích thước tệp JavaScript có thể giảm kích thước tải trọng và thời gian phân tích cú pháp tập lệnh. [Tìm hiểu thêm](https://developers.google.com/speed/docs/insights/MinifyResources)."},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"Rút gọn JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"Xóa các quy tắc không dùng khỏi tờ mẫu để giảm số byte không cần thiết tiêu tốn vào hoạt động mạng. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/unused-css)."},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"Trì hoãn tải CSS không dùng"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"Xóa JavaScript không dùng để giảm số byte tiêu tốn vào hoạt động mạng."},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"Xóa JavaScript không dùng"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"Tuổi thọ lâu dài của bộ nhớ đệm có thể tăng tốc số lượt truy cập lặp lại vào trang của bạn. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{Đã tìm thấy 1 tài nguyên}other{Đã tìm thấy # tài nguyên}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"Phân phối các nội dung tĩnh bằng chính sách bộ nhớ đệm hiệu quả"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"Sử dụng chính sách bộ nhớ đệm hiệu quả cho các nội dung tĩnh"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"Hình ảnh được tối ưu hóa sẽ tải nhanh hơn và tiêu tốn ít dữ liệu di động hơn. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"Mã hóa hình ảnh hiệu quả"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"Phân phối hình ảnh có kích thước phù hợp để tiết kiệm dữ liệu di động và cải thiện thời gian tải. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"Thay đổi kích thước hình ảnh cho phù hợp"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"Các tài nguyên dựa trên văn bản phải được phân phối ở định dạng nén (gzip, deflate hoặc brotli) để giảm thiểu tổng số byte mạng. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/text-compression)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"Bật tính năng nén văn bản"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"Các định dạng hình ảnh như JPEG 2000, JPEG XR và WebP thường nén tốt hơn so với các định dạng PNG hoặc JPEG. Điều này có nghĩa là tốc độ tải xuống nhanh hơn và tiêu tốn ít dữ liệu hơn. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/webp)."},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"Phân phối hình ảnh ở định dạng mới và hiệu quả hơn"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"Các chuỗi yêu cầu quan trọng dưới đây cho bạn biết những tài nguyên có mức độ ưu tiên cao sẽ được tải. Hãy cân nhắc giảm độ dài chuỗi, giảm kích thước tài nguyên tải xuống hoặc trì hoãn tải xuống các tài nguyên không cần thiết để cải thiện tốc độ tải trang. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)."},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{Đã tìm thấy 1 chuỗi}other{Đã tìm thấy # chuỗi}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"Giảm thiểu độ sâu của các yêu cầu quan trọng"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"Các công cụ của trình duyệt đề xuất các trang nên chứa ít hơn 1.500 nút DOM. Điểm ngọt là độ sâu của cây có ít hơn 32 thành phần và 60 thành phần con/cấp độ gốc. Một DOM lớn có thể tăng mức sử dụng bộ nhớ, khiến [các phép tính về kiểu](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations) dài hơn đồng thời tạo ra [các chỉnh sửa bố cục](https://developers.google.com/speed/articles/reflow) tốn kém. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/dom-size)."},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 nút}other{# nút}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"Tránh kích thước DOM quá lớn"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"Độ sâu DOM tối đa"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"Tổng số nút DOM"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"Tránh kích thước DOM quá lớn"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"Sử dụng tính năng CSS hiển thị phông chữ để đảm bảo văn bản hiển thị với người dùng khi phông chữ web đang tải. [Tìm hiểu thêm](https://developers.google.com/web/updates/2016/02/font-display)."},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"Đảm bảo văn bản vẫn hiển thị trong khi tải phông chữ web"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"Tất cả văn bản vẫn hiển thị trong khi tải phông chữ web"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"Danh mục"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"Hãy xem xét giảm thời gian dùng để phân tích cú pháp, biên soạn và thực thi JS. Bạn có thể giải quyết vấn đề này bằng cách phân phối các tải trọng JS nhỏ hơn."},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"Giảm thiểu công việc theo chuỗi chính"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"Giảm thiểu công việc theo chuỗi chính"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"Điểm số ở trên là điểm số ước tính về khoảng thời gian tính bằng mili giây mà ứng dụng của bạn cần để phản hồi thông tin người dùng nhập vào trong cửa sổ tải trang 5 giây bận rộn nhất. Nếu thời gian chờ lớn hơn 50 mili giây, người dùng có thể coi ứng dụng của bạn là chạy chậm. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)."},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"Thời gian chờ nhập thông tin theo ước tính"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"Chỉ số Hình ảnh có nội dung đầu tiên đánh dấu thời điểm hiển thị văn bản hoặc hình ảnh đầu tiên. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)."},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"Hình ảnh có nội dung đầu tiên"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"Chỉ số CPU nhàn rỗi đầu tiên đánh dấu thời điểm đầu tiên chuỗi chính của trang đủ yên tĩnh để xử lý thông tin nhập vào. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)."},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"CPU nhàn rỗi đầu tiên"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"Chỉ số Hình ảnh có ý nghĩa đầu tiên đo lường thời điểm nội dung chính của trang hiển thị. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)."},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"Hình ảnh có ý nghĩa đầu tiên"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"Chỉ số Thời điểm tương tác đánh dấu thời điểm trang tương tác hoàn toàn. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)."},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"Thời điểm tương tác"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"Chỉ mục tốc độ cho biết nội dung của một trang hiển thị nhanh chóng đến mức nào. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/speed-index)."},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"Chỉ mục tốc độ"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"Các lần chuyển hướng sẽ làm tốc độ tải trang chậm hơn. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/redirects)."},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"Tránh chuyển hướng trang nhiều lần"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"Chỉ số Thời gian cho byte đầu tiên xác định thời gian máy chủ của bạn gửi một phản hồi. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/ttfb)."},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"Tài liệu gốc mất {timeInMs, number, milliseconds} mili giây"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"Giảm thời gian phản hồi của máy chủ (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"Thời gian phản hồi của máy chủ chậm (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"Thời lượng"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"Tên"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"Thời gian bắt đầu"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"Loại"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"Cân nhắc trang bị API Thời gian người dùng cho ứng dụng để đo lường hiệu suất thực tế của ứng dụng trong trải nghiệm người dùng chính. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/user-timing)."},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 dấu thời gian người dùng}other{# dấu thời gian người dùng}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"Các thời điểm cụ thể và khoảng thời gian được ghi lại bằng API Thời gian người dùng"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"Xem xét thêm các gợi ý về tài nguyên kết nối trước hoặc tìm nạp DNS trước để thiết lập các kết nối sớm tới các miền quan trọng của bên thứ ba. [Tìm hiểu thêm](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)."},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"Kết nối trước với các tên miền bắt buộc"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"Hãy xem xét sử dụng <link rel=preload> để ưu tiên tìm nạp tài nguyên đang được yêu cầu vào một thời điểm khác trong quá trình tải trang. [Tìm hiểu thêm](https://developers.google.com/web/tools/lighthouse/audits/preload)."},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"Tải trước các yêu cầu chính"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"Thông tin khác về hiệu suất ứng dụng của bạn."},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"Chẩn đoán"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"Khía cạnh quan trọng nhất của hiệu suất là tốc độ hiển thị pixel nhanh chóng trên màn hình. Các chỉ số chính: Hình ảnh có nội dung đầu tiên, Hình ảnh có ý nghĩa đầu tiên"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"Các thao tác để cải thiện thời gian hiển thị hình ảnh đầu tiên"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"Những đề xuất tối ưu hóa này có thể tăng tốc độ tải trang của bạn."},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"Cơ hội"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"Các chỉ số"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"Cải thiện trải nghiệm tải tổng thể để trang phản hồi và sẵn sàng cho bạn sử dụng sớm nhất có thể. Các số liệu chính: Thời điểm tương tác, Chỉ mục tốc độ"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"Các thao tác để cải thiện hiệu suất tổng thể"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"Hiệu suất"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"Thời gian tồn tại (TTL) của bộ nhớ đệm"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"Kích thước (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"Thời gian sử dụng"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"URL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"Số byte có thể tiết kiệm được (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"Thời lượng có thể tiết kiệm được (mili giây)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"Số byte có thể tiết kiệm được là {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"Thời lượng có thể tiết kiệm được là {wastedMs, number, milliseconds} mili giây"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} mili giây"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} giây"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"Hiển thị kết quả kiểm tra"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"Điều hướng ban đầu"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"Độ trễ tối đa của đường dẫn quan trọng:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"Lỗi!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"Lỗi báo cáo: không có thông tin kiểm tra"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"Dữ liệu của phòng thí nghiệm"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"Số liệu phân tích về [Lighthouse](https://developers.google.com/web/tools/lighthouse/) của trang hiện tại trên mạng 3G mô phỏng. Đây là các giá trị ước tính và có thể thay đổi."},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"Các mục bổ sung cần kiểm tra theo cách thủ công"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"Không áp dụng"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"Cơ hội"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"Thời lượng tiết kiệm được theo ước tính"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"Số lần kiểm tra đạt yêu cầu"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"Thang điểm:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"Đã xảy ra sự cố ảnh hưởng đến lần chạy Lighthouse này:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"Các giá trị chỉ là ước tính và có thể thay đổi."},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"Cảnh báo: "}};
+
+
+},{}],80:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome 擴充程式會對此頁面的載入效能產生負面影響。建議透過無痕模式或使用未安裝擴充程式的 Chrome 設定檔來審核頁面。"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"指令碼評估"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"指令碼剖析"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"總計"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"建議減少剖析、編譯和執行 JS 所用的時間。傳送較小的 JS 負載可能有所幫助。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/bootup)。"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"縮短 JavaScript 執行時間"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript 執行時間"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"大型 GIF 放送動畫內容效率往往不佳。建議改用 MPEG4/WebM 格式的動畫影片和 PNG/WebP 格式的靜態圖片,以節省網絡位元組。[瞭解詳情](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"使用影片格式的動畫內容"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"建議延遲載入螢幕外的項目並隱藏圖片,直到重要資源全部載入後再開始操作,以縮短可互動時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)。"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"延遲載入螢幕外圖片"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"過多資源往往會阻止系統首次繪製頁面。建議內嵌重要的 JS/CSS,延遲所有不重要的 JS/樣式。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)。"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"排除阻止呈現的資源"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"網絡負載過大會造成使用者的費用負擔,且往往與過長載入時間息息相關。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)。"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"總大小為 {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"避免網絡負載過大"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"避免網絡負載過大"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"壓縮 CSS 檔案可減少網絡負載大小。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/minify-css)。"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"壓縮 CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"壓縮 JavaScript 檔案可減少負載大小和指令碼剖析時間。[瞭解詳情](https://developers.google.com/speed/docs/insights/MinifyResources)。"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"壓縮 Javascript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"從樣式表中移除未使用的規則,減少網絡活動耗用的不必要位元組。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/unused-css)。"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"延遲未使用的 CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"移除未使用的 JavaScript,以減少網絡活動耗用的位元組。"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"移除未使用的 JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"延長快取期限可加快重覆瀏覽頁面的速度。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{已找到 1 項資源}other{已找到 # 項資源}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"採用有效的快取政策提供靜態資產"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"使用有效的快取政策處理靜態資產"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"優化圖片以加快載入速度,減少流動數據用量。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"有效地進行圖片編碼"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"提供適當大小的圖片有助節省流動數據用量,並縮短載入時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"適當調整圖片大小"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"文字資源應經過 (gzip、deflate 或 brotli) 壓縮,以將網絡位元總數減至最少。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/text-compression)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"啟用文字壓縮"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000、JPEG XR 和 WebP 等圖片格式通常比 PNG 或 JPEG 有更好的壓縮效果,能夠更快完成下載及減少數據用量。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/webp)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"提供 next-gen 格式的圖片"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"下方的「關鍵要求鏈結」顯示以高優先次序發佈的資源。為了提高頁面載入速度,建議您縮短鏈結長度,縮減下載資源的大小,或延遲下載不必要資源。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)。"},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{已找到 1 個鏈結}other{已找到 # 個鏈結}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"將重要要求深度降至最低"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"瀏覽器工程師建議,頁面包含的 DOM 節點數量應少於 1,500 個左右。理想樹狀深度應包含少於 32 個元素,且少於 60 個子/父元素。大型 DOM 會增加記憶體用量、導致[樣式運算](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations)所用時間延長並產生昂貴的[版面配置自動重排](https://developers.google.com/speed/articles/reflow)費用。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/dom-size)。"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 個節點}other{# 個節點}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"避免 DOM 過大"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"DOM 深度上限"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"DOM 節點總數"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"避免 DOM 過大"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"運用顯示字型的 CSS 功能,確保使用者可在網頁字型載入時看到文字。[瞭解詳情](https://developers.google.com/web/updates/2016/02/font-display)。"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"確保文字在網頁字型載入時仍然顯示"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"在網頁字型載入時,所有文字仍然顯示"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"類別"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"建議減少剖析、編譯和執行 JS 所用的時間。傳送較小的 JS 負載可能有所幫助。"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"將主要執行緒的工作減至最少"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"將主要執行緒的工作減至最少"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"上方的分數是在頁面載入視窗最忙碌的 5 秒期間,您的應用程式對使用者輸入動作的預計回應時間 (以毫秒為單位)。如果延遲超過 50 毫秒,使用者可能會認為應用程式的速度緩慢。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)。"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"預計輸入延遲時間"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"「首次內容繪製時間」標示繪製首個文字/首張圖片的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)。"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"首次內容繪製時間"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"「首次 CPU 閒置時間」標示頁面的主要執行緒首次有空處理輸入的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)。"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"首次 CPU 閒置時間"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"「首次有效繪製時間」評估頁面主要內容顯示的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)。"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"首次有效繪製時間"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"「可互動所需時間」用於標示頁面可進行完整互動前所需的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)。"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"可互動所需時間"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"「速度指數」會顯示頁面內容的展現速度。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/speed-index)。"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"速度指數"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"重新導向會導致頁面延遲載入。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/redirects)。"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"避免多次頁面重新導向"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"「首個字節時間」會指出您的伺服器傳送回應的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/ttfb)。"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"根文件用了 {timeInMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"縮短伺服器回應時間 (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"伺服器回應時間短 (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"時間長度"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"名稱"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"開始時間"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"類別"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"建議使用「用戶使用時間」檢測您的應用程式,評估其在關鍵使用者體驗期間的實際成效。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/user-timing)。"},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 個用戶使用時間標記}other{# 個用戶使用時間標記}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"用戶使用時間標記和測量結果"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"建議新增預先連線或預先擷取 DNS 的資源提示,及早連線至重要的第三方來源。[瞭解詳情](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)。"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"預先連接至必要來源"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"建議使用 <link rel=preload> 來指定優先需要的網絡要求,並預先擷取資源。[瞭解詳情(https://developers.google.com/web/tools/lighthouse/audits/preload)。"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"預先載入關鍵要求"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"進一步瞭解應用程式效能。"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"診斷"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"評估效能的最重要指標在於像素在畫面上的呈現速度。關鍵數據:「首次內容繪製時間」、「首次有效繪製時間」"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"首次繪製改進"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"這些優化建議可提高您的頁面載入速度。"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"優化建議"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"數據"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"改善整體載入體驗,令網頁反應更靈敏快捷,盡快可供用戶使用。關鍵數據:可互動時間、速度指數"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"整體改進"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"效能"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"快取 TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"大小 (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"所用的時間"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"網址"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"可節省的用量 (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"可節省的時間 (毫秒)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"可節省 {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"可節省 {wastedMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} 秒"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"顯示審核結果"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"初始導覽"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"關鍵路徑延遲時間上限:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"發生錯誤!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"報告錯誤:無審核資料"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"實驗室數據"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) 在 3G 模擬網絡上分析目前網頁。此為預計值,可能與實際值有所不同。"},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"其他手動檢查項目"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"不適用"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"優化建議"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"預計節省的時間"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"已通過的審核"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"分數等級:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"導致這次 Lighthouse 無法順利執行的問題:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"此為預計值,可能與實際值有所不同。"},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"警告: "}};
+
+
+},{}],81:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome 擴充功能對這個頁面的載入效能有負面影響。建議透過無痕模式或不含擴充功能的 Chrome 設定檔來稽核頁面。"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"指令碼評估"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"指令碼剖析"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"總計"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"建議減少剖析、編譯和執行 JS 所耗費的時間。提供較小的 JS 酬載可能會有幫助。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/bootup)"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"減少 JavaScript 執行時間"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript 執行時間"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"使用大型 GIF 檔案來呈現動畫內容會降低網路傳輸效率,建議改用 MPEG4/WebM 影片格式來呈現動畫效果,或是使用 PNG/WebP 格式來顯示靜態圖片,以減少網路傳輸的資料量。[瞭解詳情](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"使用影片格式的動畫內容"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"建議延遲載入畫面外的項目並隱藏圖片,直到重要資源全部載入後再開始作業,以減少可互動時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"延後載入畫面外圖片"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"資源過多會妨礙首次繪製頁面。建議內嵌重要的 JS/CSS,延遲所有不重要的 JS/樣式。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"排除禁止轉譯的資源"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"大量網路酬載會造成使用者的費用負擔,而且往往會導致載入耗時過長。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"總大小為 {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"避免耗用大量網路資源"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"避免耗用大量網路資源"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"壓縮 CSS 檔案可以減少網路酬載大小。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/minify-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"壓縮 CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"壓縮 JavaScript 檔案可以減少酬載大小和指令碼剖析時間。[瞭解詳情](https://developers.google.com/speed/docs/insights/MinifyResources)"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"壓縮 JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"移除樣式表中的無用規則,盡量避免網路活動消耗不必要的流量。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/unused-css)"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"延後未使用的 CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"移除未使用的 JavaScript,減少網路活動消耗的流量。"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"移除未使用的 JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"快取效期越長,增加造訪您頁面的頻率就越高。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{找到 1 項資源}other{找到 # 項資源}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"運用有效的快取政策提供靜態資產"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"使用有效的快取政策處理靜態資產"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"最佳化圖片載入速度,減少行動數據用量。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"圖片編碼有效率"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"提供適當大小的圖片有助於節省行動數據用量、縮短載入時間。[Learn more](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"使用合適的圖片大小"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"提供的文字資源應經過 (gzip、deflate 或 brotli) 壓縮,將網路傳輸的資料量降至最低。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/text-compression)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"啟用文字壓縮"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000、JPEG XR 和 WebP 等圖片格式通常壓縮效率優於 PNG 或 JPEG,能夠更快下載完成及減少數據用量。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/webp)"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"提供 next-gen 格式的圖片"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"下方的「關鍵要求鏈結」顯示的是以高優先順序載入的資源。為了提高頁面載入速度,建議你縮短鏈結長度,降低下載資源的大小,或是延後下載非必要資源。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)。"},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{找到 1 個鏈結}other{找到 # 個鏈結}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"將關鍵要求層級降至最低"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"瀏覽器工程師建議,頁面包含的 DOM 節點數量應少於 1,500 個左右。理想樹狀層級應包含少於 32 個元素,以及少於 60 個下層/上層元素。大型的 DOM 可能造成記憶體用量增加、延長[樣式運算](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations)的過程,還會導致費工的[版面配置重排](https://developers.google.com/speed/articles/reflow)。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/dom-size)"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 個節點}other{# 個節點}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"避免 DOM 過大"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"DOM 層級上限"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"DOM 節點總數"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"避免 DOM 過大"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"運用顯示字型的 CSS 功能,確保使用者可以在載入網路字型時看到文字。[瞭解詳情](https://developers.google.com/web/updates/2016/02/font-display)"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"確認載入網站字型時文字不會消失"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"載入網站字型時沒有任何文字消失"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"類別"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"建議減少剖析、編譯和執行 JS 所耗費的時間。提供較小的 JS 酬載可能會有幫助。"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"將主要執行緒的工作降到最低"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"將主要執行緒的工作降到最低"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"上方的分數是在頁面載入視窗最忙碌的 5 秒期間,您的應用程式對於使用者輸入動作的預計回應時間 (以毫秒為單位)。如果延遲超過 50 毫秒,使用者可能會感覺應用程式的速度很慢。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"預估輸入延遲"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"「首次顯示內容所需時間」會標記寫下第一個文字或繪製第一張圖片的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)。"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"首次內容繪製"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"首次 CPU 閒置標記的是頁面的主要執行緒在第一次處理輸入作業前所需的閒置時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"首次 CPU 閒置"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"首次有效繪製可供衡量頁面主要內容顯示的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"首次有效繪製"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"可互動時間標記的是頁面提供完整互動功能的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"可互動時間"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"速度指數會顯示頁面內容填入的速度。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/speed-index)"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"速度指數"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"重新導向會導致頁面延遲載入。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/redirects)"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"避免進行多次頁面重新導向"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"第一個位元組時間會指出您的伺服器傳送回應的時間。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/ttfb)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"根文件用時 {timeInMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"減少伺服器回應時間 (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"伺服器回應時間低 (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"時間長度"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"名稱"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"開始時間"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"類型"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"建議你使用 User Timing API 檢測應用程式在關鍵使用者體驗期間的實際成效。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/user-timing)。"},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 個 User Timing 標記}other{# 個 User Timing 標記}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"User Timing 標記和測量結果"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"建議新增預先連線或預先擷取 DNS 的資源提示,及早連線至重要的第三方來源。[瞭解詳情](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"預先連上必要來源"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"建議使用 <link rel=preload> 指定在頁面載入後立即需要的資源,以優先擷取這類資源。[瞭解詳情](https://developers.google.com/web/tools/lighthouse/audits/preload)"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"預先載入重要要求"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"關於您應用程式效能的更多資訊。"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"診斷"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"像素呈現在畫面上的速度是最重要的效能層面。重要指標:首次內容繪製、首次有效繪製"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"改進首次繪製程序"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"這些最佳化建議可以提高您的頁面載入速度。"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"最佳化建議"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"指標"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"改進整體載入體驗,採用回應式頁面設計,儘快為使用者提供服務。重要指標:可互動時間、速度指數"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"整體改進"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"效能"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"快取 TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"大小 (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"花費的時間"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"網址"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"潛在減少量 (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"潛在減少量 (毫秒)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"可減少 {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"可減少 {wastedMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} 秒"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"顯示稽核結果"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"起始導覽"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"關鍵路徑延遲時間上限:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"發生錯誤!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"回報錯誤:無稽核資訊"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"研究資料"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) 在 3G 模擬網路上分析目前網頁。分析結果為預估值,可能與實際情況有所出入。"},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"其他手動檢查項目"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"不適用"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"最佳化建議"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"預估減少量"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"通過稽核項目"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"分數量尺:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"有問題導致 Lighthouse 無法順利執行這項作業:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"此為預估值,可能與實際情況有所出入。"},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"警告: "}};
+
+
+},{}],82:[function(require,module,exports){
+module.exports={
+"lighthouse-core/audits/bootup-time.js | chromeExtensionsWarning":{
+"message":"Chrome 扩展程序对此网页的加载性能产生了负面影响。请尝试在无痕模式下或使用未安装这些扩展程序的 Chrome 个人资料审核此网页。"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptEval":{
+"message":"脚本评估"},
+
+"lighthouse-core/audits/bootup-time.js | columnScriptParse":{
+"message":"脚本解析"},
+
+"lighthouse-core/audits/bootup-time.js | columnTotal":{
+"message":"总计"},
+
+"lighthouse-core/audits/bootup-time.js | description":{
+"message":"考虑减少为解析、编译和执行 JS 而花费的时间。您可能会发现,提供较小的 JS 负载有助于实现此目标。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/bootup)。"},
+
+"lighthouse-core/audits/bootup-time.js | failureTitle":{
+"message":"缩短 JavaScript 执行用时"},
+
+"lighthouse-core/audits/bootup-time.js | title":{
+"message":"JavaScript 执行用时"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | description":{
+"message":"使用大型 GIF 提供动画内容会导致效率低下。不妨考虑改用 MPEG4/WebM 视频(来提供动画)和 PNG/WebP(来提供静态图片)以减少网络活动消耗的字节数。[了解详情](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/replace-animated-gifs-with-video/)"},
+
+"lighthouse-core/audits/byte-efficiency/efficient-animated-content.js | title":{
+"message":"使用视频格式提供动画内容"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | description":{
+"message":"考虑在所有关键资源加载完毕后推迟加载屏幕外图片和处于隐藏状态的图片,从而缩短可交互前的耗时。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/offscreen-images)。"},
+
+"lighthouse-core/audits/byte-efficiency/offscreen-images.js | title":{
+"message":"推迟加载屏幕外图片"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | description":{
+"message":"资源阻止了系统对您网页的首次绘制。请考虑以内嵌方式提供关键的 JS/CSS 并推迟提供所有非关键的 JS/样式。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/blocking-resources)。"},
+
+"lighthouse-core/audits/byte-efficiency/render-blocking-resources.js | title":{
+"message":"移除阻塞渲染的资源"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | description":{
+"message":"网络负载过大不仅会让用户付出真金白银,还极有可能会延长加载用时。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/network-payloads)。"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | displayValue":{
+"message":"总大小为 {totalBytes, number, bytes} KB"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | failureTitle":{
+"message":"避免网络负载过大"},
+
+"lighthouse-core/audits/byte-efficiency/total-byte-weight.js | title":{
+"message":"避免网络负载过大"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | description":{
+"message":"缩减 CSS 文件大小可缩减网络负载规模。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/minify-css)。"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-css.js | title":{
+"message":"缩减 CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | description":{
+"message":"如果缩减 JavaScript 文件大小,则既能缩减负载规模,又能缩短脚本解析用时。[了解详情](https://developers.google.com/speed/docs/insights/MinifyResources)。"},
+
+"lighthouse-core/audits/byte-efficiency/unminified-javascript.js | title":{
+"message":"缩减 JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | description":{
+"message":"从样式表中移除未使用的规则,以减少网络活动消耗的不必要的字节数。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/unused-css)。"},
+
+"lighthouse-core/audits/byte-efficiency/unused-css-rules.js | title":{
+"message":"推迟加载未使用的 CSS"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | description":{
+"message":"移除未使用的 JavaScript 可减少网络活动消耗的字节数。"},
+
+"lighthouse-core/audits/byte-efficiency/unused-javascript.js | title":{
+"message":"移除未使用的 JavaScript"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | description":{
+"message":"延长缓存期限可加快重访您网页的速度。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/cache-policy)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | displayValue":{
+"message":"{itemCount,plural, =1{找到了 1 项资源}other{找到了 # 项资源}}"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | failureTitle":{
+"message":"采用高效的缓存策略提供静态资源"},
+
+"lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js | title":{
+"message":"针对静态资源使用高效的缓存策略"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | description":{
+"message":"如果图片经过了优化,则加载速度会更快,且消耗的移动数据网络流量会更少。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/optimize-images)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-optimized-images.js | title":{
+"message":"对图片进行高效编码"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | description":{
+"message":"提供适当大小的图片可节省移动数据网络流量并缩短加载用时。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/oversized-images)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-responsive-images.js | title":{
+"message":"适当调整图片大小"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | description":{
+"message":"对于文本资源,应先压缩(gzip、deflate 或 brotli),然后再提供,以最大限度地减少网络活动消耗的字节总数。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/text-compression)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-text-compression.js | title":{
+"message":"启用文本压缩"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | description":{
+"message":"JPEG 2000、JPEG XR 和 WebP 等图片格式的压缩效果通常比 PNG 或 JPEG 好,因此下载速度更快,消耗的数据流量更少。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/webp)。"},
+
+"lighthouse-core/audits/byte-efficiency/uses-webp-images.js | title":{
+"message":"采用新一代格式提供图片"},
+
+"lighthouse-core/audits/critical-request-chains.js | description":{
+"message":"下面的关键请求链显示了以高优先级加载的资源。请考虑缩短链长、缩减资源的下载文件大小,或者推迟下载不必要的资源,从而提高网页加载速度。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains)。"},
+
+"lighthouse-core/audits/critical-request-chains.js | displayValue":{
+"message":"{itemCount,plural, =1{找到了 1 条请求链}other{找到了 # 条请求链}}"},
+
+"lighthouse-core/audits/critical-request-chains.js | title":{
+"message":"最大限度地缩短关键请求深度"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnElement":{
+"message":"Element"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnStatistic":{
+"message":"Statistic"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | columnValue":{
+"message":"Value"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | description":{
+"message":"浏览器工程师建议,网页包含的 DOM 节点最好少于 1500 个左右。理想状况是,树深度少于 32 个元素,且少于 60 个子/父元素。大型 DOM 可能会增加内存使用量、导致[样式计算](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations)用时延长并产生高昂的[布局重排](https://developers.google.com/speed/articles/reflow)费用。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/dom-size)。"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | displayValue":{
+"message":"{itemCount,plural, =1{1 个节点}other{# 个节点}}"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | failureTitle":{
+"message":"避免 DOM 规模过大"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMDepth":{
+"message":"最大 DOM 深度"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMNodes":{
+"message":"DOM 节点总数"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | statisticDOMWidth":{
+"message":"Maximum Child Elements"},
+
+"lighthouse-core/audits/dobetterweb/dom-size.js | title":{
+"message":"避免 DOM 规模过大"},
+
+"lighthouse-core/audits/font-display.js | description":{
+"message":"利用 font-display 这项 CSS 功能,确保文本在网页字体加载期间始终对用户可见。[了解详情](https://developers.google.com/web/updates/2016/02/font-display)。"},
+
+"lighthouse-core/audits/font-display.js | failureTitle":{
+"message":"确保文本在网页字体加载期间保持可见状态"},
+
+"lighthouse-core/audits/font-display.js | title":{
+"message":"在网页字体加载期间,所有文本都保持可见状态"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | columnCategory":{
+"message":"类别"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | description":{
+"message":"考虑减少为解析、编译和执行 JS 而花费的时间。您可能会发现,提供较小的 JS 负载有助于实现此目标。"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | failureTitle":{
+"message":"最大限度地减少主线程工作"},
+
+"lighthouse-core/audits/mainthread-work-breakdown.js | title":{
+"message":"最大限度地减少主线程工作"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | description":{
+"message":"上面的分数是估算值,表示您的应用在网页加载最繁忙的 5 秒期间大概需要花费多长时间(以毫秒为单位)才能对用户输入做出响应。如果您的延迟时间超过了 50 毫秒,用户可能会感觉您的应用运行迟缓。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency)。"},
+
+"lighthouse-core/audits/metrics/estimated-input-latency.js | title":{
+"message":"输入延迟(估算值)"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | description":{
+"message":"首次内容绘制时间标记了绘制出首个文本或首张图片的时间。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint)。"},
+
+"lighthouse-core/audits/metrics/first-contentful-paint.js | title":{
+"message":"首次内容绘制时间"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | description":{
+"message":"首次 CPU 闲置时间标记了网页的主线程首次有空处理输入操作的时间。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/first-interactive)。"},
+
+"lighthouse-core/audits/metrics/first-cpu-idle.js | title":{
+"message":"首次 CPU 闲置时间"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | description":{
+"message":"首次有效绘制时间测量了网页主要内容开始对用户可见的时间。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/first-meaningful-paint)。"},
+
+"lighthouse-core/audits/metrics/first-meaningful-paint.js | title":{
+"message":"首次有效绘制时间"},
+
+"lighthouse-core/audits/metrics/interactive.js | description":{
+"message":"可交互前的耗时标记了网页提供完整交互功能的时间。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/consistently-interactive)。"},
+
+"lighthouse-core/audits/metrics/interactive.js | title":{
+"message":"可交互前的耗时"},
+
+"lighthouse-core/audits/metrics/speed-index.js | description":{
+"message":"速度指数表明了网页内容的可见填充速度。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/speed-index)。"},
+
+"lighthouse-core/audits/metrics/speed-index.js | title":{
+"message":"速度指数"},
+
+"lighthouse-core/audits/redirects.js | description":{
+"message":"重定向会在网页可加载前引入更多延迟。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/redirects)。"},
+
+"lighthouse-core/audits/redirects.js | title":{
+"message":"避免多次网页重定向"},
+
+"lighthouse-core/audits/time-to-first-byte.js | description":{
+"message":"首字节显示前的耗时表明了服务器发出响应的时间。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/ttfb)。"},
+
+"lighthouse-core/audits/time-to-first-byte.js | displayValue":{
+"message":"根文档花费了 {timeInMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/audits/time-to-first-byte.js | failureTitle":{
+"message":"缩短服务器响应用时 (TTFB)"},
+
+"lighthouse-core/audits/time-to-first-byte.js | title":{
+"message":"服务器响应用时较短 (TTFB)"},
+
+"lighthouse-core/audits/user-timings.js | columnDuration":{
+"message":"时长"},
+
+"lighthouse-core/audits/user-timings.js | columnName":{
+"message":"名称"},
+
+"lighthouse-core/audits/user-timings.js | columnStartTime":{
+"message":"开始时间"},
+
+"lighthouse-core/audits/user-timings.js | columnType":{
+"message":"类型"},
+
+"lighthouse-core/audits/user-timings.js | description":{
+"message":"考虑使用 User Timing API 检测您的应用,从而衡量应用在关键用户体验中的实际性能。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/user-timing)。"},
+
+"lighthouse-core/audits/user-timings.js | displayValue":{
+"message":"{itemCount,plural, =1{1 项 User Timing 结果}other{# 项 User Timing 结果}}"},
+
+"lighthouse-core/audits/user-timings.js | title":{
+"message":"User Timing 标记和测量结果"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | description":{
+"message":"考虑添加 preconnect 或 dns-prefetch 资源提示,以尽早与重要的第三方来源建立连接。[了解详情](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect)。"},
+
+"lighthouse-core/audits/uses-rel-preconnect.js | title":{
+"message":"预先连接到必要的来源"},
+
+"lighthouse-core/audits/uses-rel-preload.js | description":{
+"message":"考虑使用 <link rel=preload> 来优先提取当前在网页加载后期请求的资源。[了解详情](https://developers.google.com/web/tools/lighthouse/audits/preload)。"},
+
+"lighthouse-core/audits/uses-rel-preload.js | title":{
+"message":"预加载关键请求"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupDescription":{
+"message":"详细了解您的应用的性能。"},
+
+"lighthouse-core/config/default-config.js | diagnosticsGroupTitle":{
+"message":"诊断结果"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupDescription":{
+"message":"像素在屏幕上的呈现速度是性能的最重要方面。关键指标:首次内容绘制时间、首次有效绘制时间"},
+
+"lighthouse-core/config/default-config.js | firstPaintImprovementsGroupTitle":{
+"message":"改进首次绘制"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupDescription":{
+"message":"这些优化建议可以加快网页加载速度。"},
+
+"lighthouse-core/config/default-config.js | loadOpportunitiesGroupTitle":{
+"message":"优化建议"},
+
+"lighthouse-core/config/default-config.js | metricGroupTitle":{
+"message":"指标"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupDescription":{
+"message":"改善整体的加载体验,使该网页响应迅速且可尽快投入使用。关键指标:可交互前的耗时、速度指数"},
+
+"lighthouse-core/config/default-config.js | overallImprovementsGroupTitle":{
+"message":"整体改进"},
+
+"lighthouse-core/config/default-config.js | performanceCategoryTitle":{
+"message":"性能"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnCacheTTL":{
+"message":"缓存 TTL"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnSize":{
+"message":"大小 (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnTimeSpent":{
+"message":"花费的时间"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnURL":{
+"message":"网址"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedBytes":{
+"message":"有望节省的流量 (KB)"},
+
+"lighthouse-core/lib/i18n/i18n.js | columnWastedMs":{
+"message":"有望节省的时间(毫秒)"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueByteSavings":{
+"message":"有望节省 {wastedBytes, number, bytes} KB"},
+
+"lighthouse-core/lib/i18n/i18n.js | displayValueMsSavings":{
+"message":"有望节省 {wastedMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/lib/i18n/i18n.js | ms":{
+"message":"{timeInMs, number, milliseconds} 毫秒"},
+
+"lighthouse-core/lib/i18n/i18n.js | seconds":{
+"message":"{timeInMs, number, seconds} 秒"},
+
+"lighthouse-core/report/html/renderer/util.js | auditGroupExpandTooltip":{
+"message":"显示审核结果"},
+
+"lighthouse-core/report/html/renderer/util.js | crcInitialNavigation":{
+"message":"初始导航"},
+
+"lighthouse-core/report/html/renderer/util.js | crcLongestDurationLabel":{
+"message":"关键路径延迟时间上限:"},
+
+"lighthouse-core/report/html/renderer/util.js | errorLabel":{
+"message":"出错了!"},
+
+"lighthouse-core/report/html/renderer/util.js | errorMissingAuditInfo":{
+"message":"报告错误:没有任何审核信息"},
+
+"lighthouse-core/report/html/renderer/util.js | labDataTitle":{
+"message":"实验室数据"},
+
+"lighthouse-core/report/html/renderer/util.js | lsPerformanceCategoryDescription":{
+"message":"[Lighthouse](https://developers.google.com/web/tools/lighthouse/) 使用模拟 3G 网络对当前页面进行的分析。这些值都是估算值,且可能会因时而异。"},
+
+"lighthouse-core/report/html/renderer/util.js | manualAuditsGroupTitle":{
+"message":"待手动检查的其他项"},
+
+"lighthouse-core/report/html/renderer/util.js | notApplicableAuditsGroupTitle":{
+"message":"不适用"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunityResourceColumnLabel":{
+"message":"优化建议"},
+
+"lighthouse-core/report/html/renderer/util.js | opportunitySavingsColumnLabel":{
+"message":"有望节省的总时间(估算值)"},
+
+"lighthouse-core/report/html/renderer/util.js | passedAuditsGroupTitle":{
+"message":"已通过的审核"},
+
+"lighthouse-core/report/html/renderer/util.js | scorescaleLabel":{
+"message":"分数等级:"},
+
+"lighthouse-core/report/html/renderer/util.js | toplevelWarningsMessage":{
+"message":"此次 Lighthouse 运行并不顺利,原因如下:"},
+
+"lighthouse-core/report/html/renderer/util.js | varianceDisclaimer":{
+"message":"这些值都是估算值,且可能会因时而异。"},
+
+"lighthouse-core/report/html/renderer/util.js | warningHeader":{
+"message":"警告: "}};
+
+
+},{}],83:[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+const URL=require('./url-shim.js');
+
+
+
+
+
 function doExist(manifest){
 if(!manifest||!manifest.icons){
 return false;
@@ -21633,13 +39807,22 @@
 
 
 
-function sizeAtLeast(sizeRequirement,manifest){
+function pngSizedAtLeast(sizeRequirement,manifest){
 
 
 const iconValues=manifest.icons.value;
 
 const flattenedSizes=[];
-iconValues.forEach(icon=>{
+iconValues.
+
+filter(icon=>!icon.value.type.value||
+icon.value.type.value&&
+icon.value.type.value==='image/png').
+
+filter(icon=>icon.value.src.value&&
+new URL(icon.value.src.value).pathname.endsWith('.png')).
+forEach(icon=>{
+
 if(icon.value.sizes.value){
 flattenedSizes.push(...icon.value.sizes.value);
 }
@@ -21663,10 +39846,10 @@
 
 module.exports={
 doExist,
-sizeAtLeast};
+pngSizedAtLeast};
 
 
-},{}],35:[function(require,module,exports){
+},{"./url-shim.js":"url"}],84:[function(require,module,exports){
 
 
 
@@ -21874,7 +40057,193 @@
 convertNodeTimingsToTrace};
 
 
-},{}],36:[function(require,module,exports){
+},{}],85:[function(require,module,exports){
+
+
+
+
+
+'use strict';
+
+const strings=require('./strings');
+
+
+
+
+
+
+
+
+
+class LighthouseError extends Error{
+
+
+
+
+constructor(errorDefinition,properties){
+super(errorDefinition.code);
+this.name='LHError';
+this.code=errorDefinition.code;
+this.friendlyMessage=errorDefinition.message;
+this.lhrRuntimeError=!!errorDefinition.lhrRuntimeError;
+if(properties)Object.assign(this,properties);
+
+Error.captureStackTrace(this,LighthouseError);
+}
+
+
+
+
+
+static fromLighthouseError(err){
+const{code,friendlyMessage:message,...rest}=err;
+
+return new LighthouseError({code,message},{...rest});
+}
+
+
+
+
+
+
+static fromProtocolMessage(method,protocolError){
+
+const protocolErrors=Object.values(LighthouseError.errors).filter(e=>e.pattern);
+
+const matchedErrorDefinition=protocolErrors.find(e=>e.pattern.test(protocolError.message));
+if(matchedErrorDefinition){
+return new LighthouseError(matchedErrorDefinition,{
+protocolMethod:method,
+protocolError:protocolError.message});
+
+}
+
+
+let errMsg=`(${method}): ${protocolError.message}`;
+if(protocolError.data)errMsg+=` (${protocolError.data})`;
+const error=new Error(`Protocol error ${errMsg}`);
+return Object.assign(error,{protocolMethod:method,protocolError:protocolError.message});
+}}
+
+
+const ERRORS={
+
+NO_SPEEDLINE_FRAMES:{
+code:'NO_SPEEDLINE_FRAMES',
+message:strings.didntCollectScreenshots,
+lhrRuntimeError:true},
+
+SPEEDINDEX_OF_ZERO:{
+code:'SPEEDINDEX_OF_ZERO',
+message:strings.didntCollectScreenshots,
+lhrRuntimeError:true},
+
+NO_SCREENSHOTS:{
+code:'NO_SCREENSHOTS',
+message:strings.didntCollectScreenshots,
+lhrRuntimeError:true},
+
+INVALID_SPEEDLINE:{
+code:'INVALID_SPEEDLINE',
+message:strings.didntCollectScreenshots,
+lhrRuntimeError:true},
+
+
+
+NO_TRACING_STARTED:{
+code:'NO_TRACING_STARTED',
+message:strings.badTraceRecording,
+lhrRuntimeError:true},
+
+NO_NAVSTART:{
+code:'NO_NAVSTART',
+message:strings.badTraceRecording,
+lhrRuntimeError:true},
+
+NO_FCP:{
+code:'NO_FCP',
+message:strings.badTraceRecording,
+lhrRuntimeError:true},
+
+NO_DCL:{
+code:'NO_DCL',
+message:strings.badTraceRecording,
+lhrRuntimeError:true},
+
+NO_FMP:{
+code:'NO_FMP',
+message:strings.badTraceRecording},
+
+
+
+FMP_TOO_LATE_FOR_FCPUI:{code:'FMP_TOO_LATE_FOR_FCPUI',message:strings.pageLoadTookTooLong},
+NO_FCPUI_IDLE_PERIOD:{code:'NO_FCPUI_IDLE_PERIOD',message:strings.pageLoadTookTooLong},
+NO_TTI_CPU_IDLE_PERIOD:{code:'NO_TTI_CPU_IDLE_PERIOD',message:strings.pageLoadTookTooLong},
+NO_TTI_NETWORK_IDLE_PERIOD:{
+code:'NO_TTI_NETWORK_IDLE_PERIOD',
+message:strings.pageLoadTookTooLong},
+
+
+
+NO_DOCUMENT_REQUEST:{
+code:'NO_DOCUMENT_REQUEST',
+message:strings.pageLoadFailed,
+lhrRuntimeError:true},
+
+
+FAILED_DOCUMENT_REQUEST:{
+code:'FAILED_DOCUMENT_REQUEST',
+message:strings.pageLoadFailed,
+lhrRuntimeError:true},
+
+
+ERRORED_DOCUMENT_REQUEST:{
+code:'ERRORED_DOCUMENT_REQUEST',
+message:strings.pageLoadFailed,
+lhrRuntimeError:true},
+
+
+
+TRACING_ALREADY_STARTED:{
+code:'TRACING_ALREADY_STARTED',
+message:strings.internalChromeError,
+pattern:/Tracing.*started/,
+lhrRuntimeError:true},
+
+PARSING_PROBLEM:{
+code:'PARSING_PROBLEM',
+message:strings.internalChromeError,
+pattern:/Parsing problem/,
+lhrRuntimeError:true},
+
+READ_FAILED:{
+code:'READ_FAILED',
+message:strings.internalChromeError,
+pattern:/Read failed/,
+lhrRuntimeError:true},
+
+
+
+REQUEST_CONTENT_TIMEOUT:{
+code:'REQUEST_CONTENT_TIMEOUT',
+message:strings.requestContentTimeout},
+
+
+
+INVALID_URL:{
+code:'INVALID_URL',
+message:strings.urlInvalid}};
+
+
+
+
+LighthouseError.errors=ERRORS;
+LighthouseError.NO_ERROR='NO_ERROR';
+LighthouseError.UNKNOWN_ERROR='UNKNOWN_ERROR';
+module.exports=LighthouseError;
+
+
+},{"./strings":92}],86:[function(require,module,exports){
 
 
 
@@ -21883,7 +40252,7 @@
 'use strict';
 
 const URL=require('./url-shim');
-const validateColor=require('./web-inspector').Color.parse;
+const cssParsers=require('cssstyle/lib/parsers');
 
 const ALLOWED_DISPLAY_VALUES=[
 'fullscreen',
@@ -21912,15 +40281,23 @@
 
 
 
+function isValidColor(color){
+return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
+}
+
+
+
+
+
 function parseString(raw,trim){
 let value;
-let debugString;
+let warning;
 
 if(typeof raw==='string'){
 value=trim?raw.trim():raw;
 }else{
 if(raw!==undefined){
-debugString='ERROR: expected a string.';
+warning='ERROR: expected a string.';
 }
 value=undefined;
 }
@@ -21928,7 +40305,7 @@
 return{
 raw,
 value,
-debugString};
+warning};
 
 }
 
@@ -21944,10 +40321,9 @@
 }
 
 
-const validatedColor=validateColor(color.raw);
-if(!validatedColor){
+if(!isValidColor(color.raw)){
 color.value=undefined;
-color.debugString='ERROR: color parsing failed.';
+color.warning='ERROR: color parsing failed.';
 }
 
 return color;
@@ -21994,7 +40370,7 @@
 return{
 raw,
 value:documentUrl,
-debugString:'ERROR: start_url string empty'};
+warning:'ERROR: start_url string empty'};
 
 }
 const parsedAsString=parseString(raw);
@@ -22012,7 +40388,7 @@
 return{
 raw,
 value:documentUrl,
-debugString:'ERROR: invalid start_url relative to ${manifestUrl}'};
+warning:'ERROR: invalid start_url relative to ${manifestUrl}'};
 
 }
 
@@ -22021,7 +40397,7 @@
 return{
 raw,
 value:documentUrl,
-debugString:'ERROR: start_url must be same-origin as document'};
+warning:'ERROR: start_url must be same-origin as document'};
 
 }
 
@@ -22042,7 +40418,7 @@
 return{
 raw:jsonInput,
 value:DEFAULT_DISPLAY_MODE,
-debugString:parsedString.debugString};
+warning:parsedString.warning};
 
 }
 
@@ -22051,7 +40427,7 @@
 return{
 raw:jsonInput,
 value:DEFAULT_DISPLAY_MODE,
-debugString:'ERROR: \'display\' has invalid value '+displayValue+
+warning:'ERROR: \'display\' has invalid value '+displayValue+
 `. will fall back to ${DEFAULT_DISPLAY_MODE}.`};
 
 }
@@ -22059,7 +40435,7 @@
 return{
 raw:jsonInput,
 value:displayValue,
-debugString:undefined};
+warning:undefined};
 
 }
 
@@ -22072,7 +40448,7 @@
 if(orientation.value&&
 !ALLOWED_ORIENTATION_VALUES.includes(orientation.value.toLowerCase())){
 orientation.value=undefined;
-orientation.debugString='ERROR: \'orientation\' has an invalid value, will be ignored.';
+orientation.warning='ERROR: \'orientation\' has an invalid value, will be ignored.';
 }
 
 return orientation;
@@ -22100,13 +40476,13 @@
 raw:raw.density,
 value:1,
 
-debugString:undefined};
+warning:undefined};
 
 if(density.raw!==undefined){
 density.value=parseFloat(density.raw);
 if(isNaN(density.value)||!isFinite(density.value)||density.value<=0){
 density.value=1;
-density.debugString='ERROR: icon density cannot be NaN, +∞, or less than or equal to +0.';
+density.warning='ERROR: icon density cannot be NaN, +∞, or less than or equal to +0.';
 }
 }
 
@@ -22119,7 +40495,7 @@
 sizes={
 raw:raw.sizes,
 value:set.size>0?Array.from(set):undefined,
-debugString:undefined};
+warning:undefined};
 
 }else{
 sizes={...parsedSizes,value:undefined};
@@ -22133,7 +40509,7 @@
 density,
 sizes},
 
-debugString:undefined};
+warning:undefined};
 
 }
 
@@ -22149,7 +40525,7 @@
 raw,
 
 value:[],
-debugString:undefined};
+warning:undefined};
 
 }
 
@@ -22158,7 +40534,7 @@
 raw,
 
 value:[],
-debugString:'ERROR: \'icons\' expected to be an array but is not.'};
+warning:'ERROR: \'icons\' expected to be an array but is not.'};
 
 }
 
@@ -22175,7 +40551,7 @@
 return{
 raw,
 value,
-debugString:undefined};
+warning:undefined};
 
 }
 
@@ -22194,7 +40570,7 @@
 appUrl.value=new URL(appUrl.value).href;
 }catch(e){
 appUrl.value=undefined;
-appUrl.debugString='ERROR: invalid application URL ${raw.url}';
+appUrl.warning='ERROR: invalid application URL ${raw.url}';
 }
 }
 
@@ -22205,7 +40581,7 @@
 id,
 url:appUrl},
 
-debugString:undefined};
+warning:undefined};
 
 }
 
@@ -22219,7 +40595,7 @@
 return{
 raw,
 value:undefined,
-debugString:undefined};
+warning:undefined};
 
 }
 
@@ -22227,7 +40603,7 @@
 return{
 raw,
 value:undefined,
-debugString:'ERROR: \'related_applications\' expected to be an array but is not.'};
+warning:'ERROR: \'related_applications\' expected to be an array but is not.'};
 
 }
 
@@ -22241,7 +40617,7 @@
 return{
 raw,
 value,
-debugString:undefined};
+warning:undefined};
 
 }
 
@@ -22251,13 +40627,13 @@
 function parsePreferRelatedApplications(jsonInput){
 const raw=jsonInput.prefer_related_applications;
 let value;
-let debugString;
+let warning;
 
 if(typeof raw==='boolean'){
 value=raw;
 }else{
 if(raw!==undefined){
-debugString='ERROR: \'prefer_related_applications\' expected to be a boolean.';
+warning='ERROR: \'prefer_related_applications\' expected to be a boolean.';
 }
 value=undefined;
 }
@@ -22265,7 +40641,7 @@
 return{
 raw,
 value,
-debugString};
+warning};
 
 }
 
@@ -22302,7 +40678,7 @@
 return{
 raw:string,
 value:undefined,
-debugString:'ERROR: file isn\'t valid JSON: '+e};
+warning:'ERROR: file isn\'t valid JSON: '+e};
 
 }
 
@@ -22324,13 +40700,13 @@
 return{
 raw:string,
 value:manifest,
-debugString:undefined};
+warning:undefined};
 
 }
 
 module.exports=parse;
 
-},{"./url-shim":"url","./web-inspector":47}],37:[function(require,module,exports){
+},{"./url-shim":"url","cssstyle/lib/parsers":161}],87:[function(require,module,exports){
 
 
 
@@ -22338,7 +40714,6 @@
 
 'use strict';
 
-const NetworkManager=require('./web-inspector').NetworkManager;
 const NetworkRequest=require('./network-request');
 const EventEmitter=require('events').EventEmitter;
 const log=require('lighthouse-logger');
@@ -22380,10 +40755,6 @@
 return super.once(event,listener);
 }
 
-get EventTypes(){
-return NetworkManager.Events;
-}
-
 isIdle(){
 return!!this._getActiveIdlePeriod(0);
 }
@@ -22438,6 +40809,18 @@
 
 
 
+static _isFrameRootRequestAndFinished(record){
+const isFrameRootRequest=record.url===record.documentURL;
+const responseReceived=record.responseReceivedTime>0;
+return!!(isFrameRootRequest&&responseReceived&&record.endTime);
+}
+
+
+
+
+
+
+
 
 
 static findNetworkQuietPeriods(networkRecords,allowedConcurrentRequests,endTime=Infinity){
@@ -22452,7 +40835,9 @@
 
 
 timeBoundaries.push({time:record.startTime*1000,isStart:true});
-if(record.finished||NetworkRecorder._isQUICAndFinished(record)){
+if(record.finished||
+NetworkRecorder._isQUICAndFinished(record)||
+NetworkRecorder._isFrameRootRequestAndFinished(record)){
 timeBoundaries.push({time:record.endTime*1000,isStart:false});
 }
 });
@@ -22704,7 +41089,8 @@
 
 module.exports=NetworkRecorder;
 
-},{"./network-request":38,"./web-inspector":47,"events":62,"lighthouse-logger":125}],38:[function(require,module,exports){
+},{"./network-request":88,"events":111,"lighthouse-logger":147}],88:[function(require,module,exports){
+(function(global){
 
 
 
@@ -22749,7 +41135,10 @@
 TextTrack:'TextTrack',
 WebSocket:'WebSocket',
 Other:'Other',
-Manifest:'Manifest'};
+Manifest:'Manifest',
+SignedExchange:'SignedExchange',
+Ping:'Ping',
+CSPViolationReport:'CSPViolationReport'};
 
 
 module.exports=class NetworkRequest{
@@ -22801,6 +41190,8 @@
 
 this.responseHeaders=[];
 
+this.responseHeadersText='';
+
 this.fetchedViaServiceWorker=false;
 
 this.frameId='';
@@ -22810,6 +41201,13 @@
 
 
 
+hasErrorStatusCode(){
+return this.statusCode>=400;
+}
+
+
+
+
 setInitiatorRequest(initiator){
 this.initiatorRequest=initiator;
 }
@@ -22879,6 +41277,7 @@
 }
 
 this._updateResponseReceivedTimeIfNecessary();
+this._updateTransferSizeForLightRiderIfNecessary();
 }
 
 
@@ -22941,12 +41340,15 @@
 this.timing=response.timing;
 if(resourceType)this.resourceType=RESOURCE_TYPES[resourceType];
 this.mimeType=response.mimeType;
+this.responseHeadersText=response.headersText||'';
 this.responseHeaders=NetworkRequest._headersDictToHeadersArray(response.headers);
 
 this.fetchedViaServiceWorker=!!response.fromServiceWorker;
 
 if(this.fromMemoryCache)this.timing=undefined;
 if(this.timing)this._recomputeTimesWithResourceTiming(this.timing);
+
+this._updateTransferSizeForLightRiderIfNecessary();
 }
 
 
@@ -22979,6 +41381,21 @@
 
 
 
+_updateTransferSizeForLightRiderIfNecessary(){
+
+if(!global.isLightRider)return;
+
+if(this.transferSize)return;
+
+const totalFetchedSize=this.responseHeaders.find(item=>item.name==='X-TotalFetchedSize');
+
+if(!totalFetchedSize)return;
+this.transferSize=parseFloat(totalFetchedSize.value);
+}
+
+
+
+
 
 
 
@@ -23008,7 +41425,8 @@
 }};
 
 
-},{"./url-shim":"url"}],39:[function(require,module,exports){
+}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+},{"./url-shim":"url"}],89:[function(require,module,exports){
 
 
 
@@ -23072,7 +41490,6 @@
 
 
 
-
 function checkTimeSinceLastLongTask(){
 
 
@@ -23089,14 +41506,93 @@
 });
 }
 
+
+
+
+
+
+
+function getElementsInDocument(selector){
+
+const results=[];
+
+
+const _findAllElements=nodes=>{
+for(let i=0,el;el=nodes[i];++i){
+if(!selector||el.matches(selector)){
+results.push(el);
+}
+
+if(el.shadowRoot){
+_findAllElements(el.shadowRoot.querySelectorAll('*'));
+}
+}
+};
+_findAllElements(document.querySelectorAll('*'));
+
+return results;
+}
+
+
+
+
+
+
+
+
+function getOuterHTMLSnippet(element,ignoreAttrs=[]){
+const clone=element.cloneNode();
+
+ignoreAttrs.forEach(attribute=>{
+clone.removeAttribute(attribute);
+});
+
+const reOpeningTag=/^.*?>/;
+const match=clone.outerHTML.match(reOpeningTag);
+
+return match&&match[0]||'';
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function ultradumbBenchmark(){
+const start=Date.now();
+let iterations=0;
+
+while(Date.now()-start<500){
+let s='';
+for(let j=0;j<100000;j++)s+='a';
+
+iterations++;
+}
+
+const durationInSeconds=(Date.now()-start)/1000;
+return iterations/durationInSeconds;
+}
+
 module.exports={
-wrapRuntimeEvalErrorInBrowser,
-registerPerformanceObserverInPage,
-checkTimeSinceLastLongTask};
+wrapRuntimeEvalErrorInBrowserString:wrapRuntimeEvalErrorInBrowser.toString(),
+registerPerformanceObserverInPageString:registerPerformanceObserverInPage.toString(),
+checkTimeSinceLastLongTaskString:checkTimeSinceLastLongTask.toString(),
+getElementsInDocumentString:getElementsInDocument.toString(),
+getOuterHTMLSnippetString:getOuterHTMLSnippet.toString(),
+getOuterHTMLSnippet:getOuterHTMLSnippet,
+ultradumbBenchmark:ultradumbBenchmark,
+ultradumbBenchmarkString:ultradumbBenchmark.toString()};
 
 
-},{}],40:[function(require,module,exports){
-
+},{}],90:[function(require,module,exports){
 
 
 
@@ -23107,66 +41603,80 @@
 const log=require('lighthouse-logger');
 
 
+
+
 const SENTRY_URL='https://a6bb0da87ee048cc9ae2a345fc09ab2e:63a7029f46f74265981b7e005e0f69f8@sentry.io/174697';
 
-const noop=()=>Promise.resolve();
-const sentryApi={
+
+const SAMPLE_RATE=0.01;
+
+
+const SAMPLED_ERRORS=[];
+
+
+
+
+const noop=()=>{};
+
+
+
+
+
+const sentryDelegate={
+init,
+
 captureMessage:noop,
-captureException:noop,
+
 captureBreadcrumb:noop,
-mergeContext:noop,
-getContext:noop};
 
+getContext:noop,
 
-const SAMPLED_ERRORS=[
-
-{pattern:/DOCUMENT_REQUEST$/,rate:0.1},
-{pattern:/(IDLE_PERIOD|FMP_TOO_LATE)/,rate:0.1},
-{pattern:/^NO_.*/,rate:0.1},
-
-{pattern:/Could not load stylesheet/,rate:0.01},
-{pattern:/Failed to decode/,rate:0.1},
-{pattern:/All image optimizations failed/,rate:0.1},
-{pattern:/No.*resource with given/,rate:0.01},
-{pattern:/No.*node with given id/,rate:0.01}];
+captureException:async()=>{}};
 
 
 
 
 
 
-const sentryDelegate=Object.assign({},sentryApi);
-sentryDelegate.init=function init(opts){
+function init(opts){
+
 if(!opts.flags.enableErrorReporting){
-
 return;
 }
 
-const environmentData=opts.environmentData||{};
-const sentryConfig=Object.assign({},environmentData,{captureUnhandledRejections:true});
+
+if(SAMPLE_RATE<=Math.random()){
+return;
+}
 
 try{
 const Sentry=require('raven');
+const sentryConfig=Object.assign({},opts.environmentData,
+{captureUnhandledRejections:true});
 Sentry.config(SENTRY_URL,sentryConfig).install();
-Object.keys(sentryApi).forEach(functionName=>{
-
-sentryDelegate[functionName]=(...args)=>Sentry[functionName](...args);
-});
 
 
-sentryDelegate.captureException=(err,opts)=>{
-opts=opts||{};
+sentryDelegate.captureMessage=(...args)=>Sentry.captureMessage(...args);
+sentryDelegate.captureBreadcrumb=(...args)=>Sentry.captureBreadcrumb(...args);
+sentryDelegate.getContext=()=>Sentry.getContext();
 
-const empty=Promise.resolve();
 
-if(!err)return empty;
+sentryDelegate.captureException=async(err,opts={})=>{
 
-if(err.expected)return empty;
+if(!err)return;
+
+
+
+if(err.expected)return;
+
 
 const sampledErrorMatch=SAMPLED_ERRORS.find(sample=>sample.pattern.test(err.message));
-if(sampledErrorMatch&&sampledErrorMatch.rate<=Math.random())return empty;
+if(sampledErrorMatch&&sampledErrorMatch.rate<=Math.random())return;
+
+
 
 if(err.protocolMethod){
+
 opts.fingerprint=['{{ default }}',err.protocolMethod,err.protocolError];
 }
 
@@ -23174,26 +41684,25 @@
 Sentry.captureException(err,opts,()=>resolve());
 });
 };
+
+const context=Object.assign({
+url:opts.url,
+deviceEmulation:!opts.flags.disableDeviceEmulation,
+emulatedFormFactor:opts.flags.emulatedFormFactor,
+throttlingMethod:opts.flags.throttlingMethod},
+opts.flags.throttling);
+Sentry.mergeContext({extra:Object.assign({},opts.environmentData.extra,context)});
 }catch(e){
 log.warn(
 'sentry',
 'Could not load raven library, errors will not be reported.');
 
 }
-
-const context=Object.assign({
-url:opts.url,
-deviceEmulation:!opts.flags.disableDeviceEmulation,
-throttlingMethod:opts.flags.throttlingMethod},
-opts.flags.throttling);
-
-sentryDelegate.mergeContext({extra:Object.assign({},environmentData.extra,context)});
-return context;
-};
+}
 
 module.exports=sentryDelegate;
 
-},{"lighthouse-logger":125,"raven":58}],41:[function(require,module,exports){
+},{"lighthouse-logger":147,"raven":107}],91:[function(require,module,exports){
 
 
 
@@ -23274,7 +41783,7 @@
 getLogNormalDistribution};
 
 
-},{}],42:[function(require,module,exports){
+},{}],92:[function(require,module,exports){
 
 
 
@@ -23287,12 +41796,13 @@
 didntCollectScreenshots:`Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse.`,
 badTraceRecording:`Something went wrong with recording the trace over your page load. Please run Lighthouse again.`,
 pageLoadTookTooLong:`Your page took too long to load. Please follow the opportunities in the report to reduce your page load time, and then try re-running Lighthouse.`,
-pageLoadFailed:`Your page failed to load. Verify that the URL is valid and re-run Lighthouse.`,
+pageLoadFailed:`Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests.`,
 internalChromeError:`An internal Chrome error occurred. Please restart Chrome and try re-running Lighthouse.`,
-requestContentTimeout:'Fetching resource content has exceeded the allotted time'};
+requestContentTimeout:'Fetching resource content has exceeded the allotted time',
+urlInvalid:`The URL you have provided appears to be invalid.`};
 
 
-},{}],43:[function(require,module,exports){
+},{}],93:[function(require,module,exports){
 
 
 
@@ -23312,14 +41822,17 @@
 
 
 
+
+
+
 const taskGroups={
 parseHTML:{
-id:'',
+id:'parseHTML',
 label:'Parse HTML & CSS',
 traceEventNames:['ParseHTML','ParseAuthorStyleSheet']},
 
 styleLayout:{
-id:'',
+id:'styleLayout',
 label:'Style & Layout',
 traceEventNames:[
 'ScheduleStyleRecalculation',
@@ -23330,7 +41843,7 @@
 
 
 paintCompositeRender:{
-id:'',
+id:'paintCompositeRender',
 label:'Rendering',
 traceEventNames:[
 'Animation',
@@ -23350,12 +41863,12 @@
 
 
 scriptParseCompile:{
-id:'',
+id:'scriptParseCompile',
 label:'Script Parsing & Compilation',
 traceEventNames:['v8.compile','v8.compileModule','v8.parseOnBackground']},
 
 scriptEvaluation:{
-id:'',
+id:'scriptEvaluation',
 label:'Script Evaluation',
 traceEventNames:[
 'EventDispatch',
@@ -23370,7 +41883,7 @@
 
 
 garbageCollection:{
-id:'',
+id:'garbageCollection',
 label:'Garbage Collection',
 traceEventNames:[
 'GCEvent',
@@ -23382,7 +41895,7 @@
 
 
 other:{
-id:'',
+id:'other',
 label:'Other',
 traceEventNames:[
 'MessageLoop::RunTask',
@@ -23394,8 +41907,7 @@
 
 
 const taskNameToGroup={};
-for(const[groupId,group]of Object.entries(taskGroups)){
-group.id=groupId;
+for(const group of Object.values(taskGroups)){
 for(const traceEventName of group.traceEventNames){
 taskNameToGroup[traceEventName]=group;
 }
@@ -23406,7 +41918,7 @@
 taskNameToGroup};
 
 
-},{}],44:[function(require,module,exports){
+},{}],94:[function(require,module,exports){
 
 
 
@@ -23607,83 +42119,7 @@
 
 module.exports=Metrics;
 
-},{"lighthouse-logger":125}],45:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const WebInspector=require('../web-inspector');
-
-
-
-
-
-
-
-
-
-class TraceParser{
-constructor(){
-
-this.traceEvents=[];
-
-this.tracingModel={
-reset:()=>this._reset(),
-
-addEvents:evts=>this._addEvents(evts)};
-
-
-const delegateMock={
-loadingProgress:()=>{},
-loadingStarted:()=>{},
-
-loadingComplete:success=>{
-if(!success)throw new Error('Parsing problem');
-}};
-
-this.loader=new WebInspector.TimelineLoader(this.tracingModel,delegateMock);
-}
-
-
-
-
-_reset(){
-this.traceEvents=[];
-}
-
-
-
-
-
-_addEvents(evts){
-this.traceEvents.push(...evts);
-}
-
-
-
-
-
-parseChunk(data){
-this.loader.write(data);
-}
-
-
-
-
-
-getTrace(){
-return{
-traceEvents:this.traceEvents};
-
-}}
-
-
-module.exports=TraceParser;
-
-},{"../web-inspector":47}],46:[function(require,module,exports){
+},{"lighthouse-logger":147}],95:[function(require,module,exports){
 
 
 
@@ -23700,7 +42136,7 @@
 const SCHEDULABLE_TASK_TITLE_ALT1='ThreadControllerImpl::DoWork';
 
 const SCHEDULABLE_TASK_TITLE_ALT2='ThreadControllerImpl::RunTask';
-const LHError=require('../errors');
+const LHError=require('../lh-error');
 
 class TraceProcessor{
 
@@ -23709,6 +42145,20 @@
 
 
 
+static assertHasToplevelEvents(events){
+const hasToplevelTask=events.some(TraceProcessor.isScheduleableTask);
+if(!hasToplevelTask){
+throw new Error('Could not find any top level events');
+}
+}
+
+
+
+
+
+
+
+
 
 
 
@@ -23861,12 +42311,6 @@
 
 }
 
-
-
-if(!topLevelEvents.length){
-throw new Error('Could not find any top level events');
-}
-
 return topLevelEvents;
 }
 
@@ -23927,7 +42371,7 @@
 
 module.exports=TraceProcessor;
 
-},{"../errors":33}],47:[function(require,module,exports){
+},{"../lh-error":85}],96:[function(require,module,exports){
 (function(global){
 
 
@@ -23942,149 +42386,45 @@
 
 
 module.exports=function(){
-if(global.WebInspector){
-return global.WebInspector;
+if(global.SDK){
+return global.SDK;
 }
 
 
-
-if(global.self!==global){
-global.self=global;
-}
-
-if(typeof global.window==='undefined'){
-global.window=global;
-}
-
+global.SDK={};
+global.TextUtils={};
 global.Node={
 ELEMENT_NODE:1,
 TEXT_NODE:3};
 
-
-global.CSSAgent={};
-global.CSSAgent.StyleSheetOrigin={
-INJECTED:'injected',
-USER_AGENT:'user-agent',
-INSPECTOR:'inspector',
-REGULAR:'regular'};
-
-
-global.CSS={};
-global.CSS.supports=()=>true;
-
-
-
-const _setImmediate=global.setImmediate;
-
-global.Runtime=global.Runtime||{};
-global.Runtime.experiments=global.Runtime.experiments||{};
-
-
-global.Runtime.experiments.isEnabled=_=>false;
-
-const _queryParam=global.Runtime.queryParam;
-global.Runtime.queryParam=function(arg){
-switch(arg){
-case'remoteFrontend':
-return false;
-case'ws':
-return false;
-default:{
-if(_queryParam){
-return _queryParam.call(global.Runtime,arg);
-}
-throw new Error('Mock queryParam case not implemented.');
-}}
-
-};
-
-global.TreeElement={};
-global.WorkerRuntime={};
-
 global.Protocol={
-Agents(){}};
+CSS:{
+StyleSheetOrigin:{
+Injected:'injected',
+UserAgent:'user-agent',
+Inspector:'inspector',
+Regular:'regular'}}};
 
 
-global.WebInspector={};
-const WebInspector=global.WebInspector;
-WebInspector._moduleSettings={
-cacheDisabled:{
-addChangeListener(){},
-get(){
-return false;
-}},
-
-monitoringXHREnabled:{
-addChangeListener(){},
-get(){
-return false;
-}},
-
-showNativeFunctionsInJSProfile:{
-addChangeListener(){},
-get(){
-return true;
-}}};
 
 
-WebInspector.moduleSetting=function(settingName){
-return this._moduleSettings[settingName];
+
+
+
+
+String.prototype.computeLineEndings=function(){
+const endings=[];
+for(let i=0;i<this.length;i++){
+if(this.charAt(i)==='\n'){
+endings.push(i);
+}
+}
+endings.push(this.length);
+return endings;
 };
 
-
-require('chrome-devtools-frontend/front_end/common/Object.js');
-require('chrome-devtools-frontend/front_end/common/ParsedURL.js');
-require('chrome-devtools-frontend/front_end/common/UIString.js');
-require('chrome-devtools-frontend/front_end/common/SegmentedRange.js');
-require('chrome-devtools-frontend/front_end/platform/utilities.js');
-require('chrome-devtools-frontend/front_end/sdk/Target.js');
-require('chrome-devtools-frontend/front_end/sdk/TargetManager.js');
-
-
-WebInspector.targetManager={
-observeTargets(){},
-addEventListener(){}};
-
-WebInspector.settings={
-createSetting(){
-return{
-get(){
-return false;
-},
-addChangeListener(){}};
-
-}};
-
-WebInspector.console={
-error(){}};
-
-WebInspector.VBox=function(){};
-WebInspector.HBox=function(){};
-WebInspector.ViewportDataGrid=function(){};
-WebInspector.ViewportDataGridNode=function(){};
-global.WorkerRuntime.Worker=function(){};
-
-
-require('chrome-devtools-frontend/front_end/common/TextUtils.js');
-require('chrome-devtools-frontend/front_end/timeline/TimelineLoader.js');
-
-
-WebInspector.ConsoleMessage=function(){};
-WebInspector.ConsoleMessage.MessageSource={
-Network:'network'};
-
-WebInspector.ConsoleMessage.MessageLevel={
-Log:'log'};
-
-WebInspector.ConsoleMessage.MessageType={
-Log:'log'};
-
-
-
-require('chrome-devtools-frontend/front_end/common/Color.js');
-
-
-require('chrome-devtools-frontend/front_end/common/TextRange.js');
+require('chrome-devtools-frontend/front_end/text_utils/Text.js');
+require('chrome-devtools-frontend/front_end/text_utils/TextRange.js');
 require('chrome-devtools-frontend/front_end/sdk/CSSMatchedStyles.js');
 require('chrome-devtools-frontend/front_end/sdk/CSSMedia.js');
 require('chrome-devtools-frontend/front_end/sdk/CSSMetadata.js');
@@ -24092,21 +42432,22 @@
 require('chrome-devtools-frontend/front_end/sdk/CSSRule.js');
 require('chrome-devtools-frontend/front_end/sdk/CSSStyleDeclaration.js');
 
-WebInspector.CSSMetadata._generatedProperties=[
-{
-name:'font-size',
-inherited:true}];
-
-
-
-
-global.setImmediate=_setImmediate;
-
-return WebInspector;
+return global.SDK;
 }();
 
 }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"chrome-devtools-frontend/front_end/common/Color.js":99,"chrome-devtools-frontend/front_end/common/Object.js":100,"chrome-devtools-frontend/front_end/common/ParsedURL.js":101,"chrome-devtools-frontend/front_end/common/SegmentedRange.js":102,"chrome-devtools-frontend/front_end/common/TextRange.js":103,"chrome-devtools-frontend/front_end/common/TextUtils.js":104,"chrome-devtools-frontend/front_end/common/UIString.js":105,"chrome-devtools-frontend/front_end/platform/utilities.js":106,"chrome-devtools-frontend/front_end/sdk/CSSMatchedStyles.js":107,"chrome-devtools-frontend/front_end/sdk/CSSMedia.js":108,"chrome-devtools-frontend/front_end/sdk/CSSMetadata.js":109,"chrome-devtools-frontend/front_end/sdk/CSSProperty.js":110,"chrome-devtools-frontend/front_end/sdk/CSSRule.js":111,"chrome-devtools-frontend/front_end/sdk/CSSStyleDeclaration.js":112,"chrome-devtools-frontend/front_end/sdk/Target.js":113,"chrome-devtools-frontend/front_end/sdk/TargetManager.js":114,"chrome-devtools-frontend/front_end/timeline/TimelineLoader.js":115}],48:[function(require,module,exports){
+},{"chrome-devtools-frontend/front_end/sdk/CSSMatchedStyles.js":153,"chrome-devtools-frontend/front_end/sdk/CSSMedia.js":154,"chrome-devtools-frontend/front_end/sdk/CSSMetadata.js":155,"chrome-devtools-frontend/front_end/sdk/CSSProperty.js":156,"chrome-devtools-frontend/front_end/sdk/CSSRule.js":157,"chrome-devtools-frontend/front_end/sdk/CSSStyleDeclaration.js":158,"chrome-devtools-frontend/front_end/text_utils/Text.js":159,"chrome-devtools-frontend/front_end/text_utils/TextRange.js":160}],97:[function(require,module,exports){
+
+
+
+
+
+
+
+
+
+
+
 
 
 
@@ -24118,11 +42459,11 @@
 
 const ELLIPSIS='\u2026';
 const NBSP='\xa0';
-const PASS_THRESHOLD=0.75;
+const PASS_THRESHOLD=0.9;
 
 const RATINGS={
 PASS:{label:'pass',minScore:PASS_THRESHOLD},
-AVERAGE:{label:'average',minScore:0.45},
+AVERAGE:{label:'average',minScore:0.5},
 FAIL:{label:'fail'},
 ERROR:{label:'error'}};
 
@@ -24140,6 +42481,52 @@
 
 
 
+
+
+
+
+static prepareReportResult(result){
+
+const clone=JSON.parse(JSON.stringify(result));
+
+
+if(!clone.configSettings.locale){
+clone.configSettings.locale='en';
+}
+Util.setNumberDateLocale(clone.configSettings.locale);
+if(clone.i18n&&clone.i18n.rendererFormattedStrings){
+Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
+}
+
+if(typeof clone.categories!=='object')throw new Error('No categories provided.');
+clone.reportCategories=Object.values(clone.categories);
+
+
+for(const category of clone.reportCategories){
+category.auditRefs.forEach(auditMeta=>{
+const result=clone.audits[auditMeta.id];
+auditMeta.result=result;
+});
+}
+
+return clone;
+}
+
+
+
+
+
+static updateAllUIStrings(rendererFormattedStrings){
+
+for(const[key,value]of Object.entries(rendererFormattedStrings)){
+Util.UIStrings[key]=value;
+}
+}
+
+
+
+
+
 static formatDisplayValue(displayValue){
 if(typeof displayValue==='string')return displayValue;
 if(!displayValue)return'';
@@ -24194,10 +42581,7 @@
 case'numeric':
 case'binary':
 default:
-
-
-
-return Number(audit.score)===1;}
+return Number(audit.score)>=RATINGS.PASS.minScore;}
 
 }
 
@@ -24235,7 +42619,7 @@
 
 static formatNumber(number,granularity=0.1){
 const coarseValue=Math.round(number/granularity)*granularity;
-return coarseValue.toLocaleString();
+return coarseValue.toLocaleString(Util.numberDateLocale);
 }
 
 
@@ -24244,7 +42628,8 @@
 
 
 static formatBytesToKB(size,granularity=0.1){
-const kbs=(Math.round(size/1024/granularity)*granularity).toLocaleString();
+const kbs=(Math.round(size/1024/granularity)*granularity).
+toLocaleString(Util.numberDateLocale);
 return`${kbs}${NBSP}KB`;
 }
 
@@ -24255,7 +42640,7 @@
 
 static formatMilliseconds(ms,granularity=10){
 const coarseTime=Math.round(ms/granularity)*granularity;
-return`${coarseTime.toLocaleString()}${NBSP}ms`;
+return`${coarseTime.toLocaleString(Util.numberDateLocale)}${NBSP}ms`;
 }
 
 
@@ -24265,7 +42650,7 @@
 
 static formatSeconds(ms,granularity=0.1){
 const coarseTime=Math.round(ms/1000/granularity)*granularity;
-return`${coarseTime.toLocaleString()}${NBSP}s`;
+return`${coarseTime.toLocaleString(Util.numberDateLocale)}${NBSP}s`;
 }
 
 
@@ -24274,18 +42659,19 @@
 
 
 static formatDateTime(date){
+
 const options={
 month:'short',day:'numeric',year:'numeric',
 hour:'numeric',minute:'numeric',timeZoneName:'short'};
 
-let formatter=new Intl.DateTimeFormat('en-US',options);
+let formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);
 
 
 
 const tz=formatter.resolvedOptions().timeZone;
 if(!tz||tz.toLowerCase()==='etc/unknown'){
 options.timeZone='UTC';
-formatter=new Intl.DateTimeFormat('en-US',options);
+formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);
 }
 return formatter.format(new Date(date));
 }
@@ -24409,15 +42795,6 @@
 
 
 
-
-static chainDuration(startTime,endTime){
-return Util.formatNumber((endTime-startTime)*1000);
-}
-
-
-
-
-
 static getEnvironmentDisplayValues(settings){
 const emulationDesc=Util.getEmulationDescriptions(settings);
 
@@ -24477,23 +42854,88 @@
 summary='Unknown';}
 
 
-const deviceEmulation=settings.disableDeviceEmulation?'No emulation':'Emulated Nexus 5X';
+let deviceEmulation='No emulation';
+if(!settings.disableDeviceEmulation){
+if(settings.emulatedFormFactor==='mobile')deviceEmulation='Emulated Nexus 5X';
+if(settings.emulatedFormFactor==='desktop')deviceEmulation='Emulated Desktop';
+}
+
 return{
 deviceEmulation,
 cpuThrottling,
 networkThrottling,
 summary:`${deviceEmulation}, ${summary}`};
 
+}
+
+
+
+
+
+static setNumberDateLocale(locale){
+Util.numberDateLocale=locale;
+
+
+if(Util.numberDateLocale==='en-XA')Util.numberDateLocale='de';
 }}
 
 
+
+
+
+
+Util.numberDateLocale='en';
+
+
+
+
+
+Util.UIStrings={
+
+varianceDisclaimer:'Values are estimated and may vary.',
+
+opportunityResourceColumnLabel:'Opportunity',
+
+opportunitySavingsColumnLabel:'Estimated Savings',
+
+
+errorMissingAuditInfo:'Report error: no audit information',
+
+errorLabel:'Error!',
+
+warningHeader:'Warnings: ',
+
+auditGroupExpandTooltip:'Show audits',
+
+passedAuditsGroupTitle:'Passed audits',
+
+notApplicableAuditsGroupTitle:'Not applicable',
+
+manualAuditsGroupTitle:'Additional items to manually check',
+
+
+toplevelWarningsMessage:'There were issues affecting this run of Lighthouse:',
+
+scorescaleLabel:'Score scale:',
+
+
+crcInitialNavigation:'Initial Navigation',
+
+crcLongestDurationLabel:'Maximum critical path latency:',
+
+
+lsPerformanceCategoryDescription:'[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on emulated 3G. Values are estimated and may vary.',
+
+labDataTitle:'Lab Data'};
+
+
 if(typeof module!=='undefined'&&module.exports){
 module.exports=Util;
 }else{
 self.Util=Util;
 }
 
-},{}],49:[function(require,module,exports){
+},{}],98:[function(require,module,exports){
 
 
 
@@ -24614,7 +43056,7 @@
 
 module.exports=ReportGenerator;
 
-},{"./html/html-report-assets":58}],50:[function(require,module,exports){
+},{"./html/html-report-assets":107}],99:[function(require,module,exports){
 (function(process,__dirname){
 
 
@@ -24629,12 +43071,14 @@
 const ReportScoring=require('./scoring');
 const Audit=require('./audits/audit');
 const log=require('lighthouse-logger');
+const i18n=require('./lib/i18n/i18n.js');
 const assetSaver=require('./lib/asset-saver');
 
 const path=require('path');
 const URL=require('./lib/url-shim');
 const Sentry=require('./lib/sentry');
 const generateReport=require('./report/report-generator').generateReport;
+const LHError=require('./lib/lh-error.js');
 
 
 
@@ -24645,10 +43089,10 @@
 
 
 
-static async run(connection,opts){
+static async run(connection,runOpts){
 try{
 const startTime=Date.now();
-const settings=opts.config.settings;
+const settings=runOpts.config.settings;
 
 
 
@@ -24657,11 +43101,9 @@
 const lighthouseRunWarnings=[];
 
 const sentryContext=Sentry.getContext();
-
 Sentry.captureBreadcrumb({
 message:'Run started',
 category:'lifecycle',
-
 data:sentryContext&&sentryContext.extra});
 
 
@@ -24682,22 +43124,22 @@
 if(!requestedUrl){
 throw new Error('Cannot run audit mode on empty URL');
 }
-if(opts.url&&opts.url!==requestedUrl){
+if(runOpts.url&&!URL.equalWithExcludedFragments(runOpts.url,requestedUrl)){
 throw new Error('Cannot run audit mode on different URL');
 }
 }else{
-if(typeof opts.url!=='string'||opts.url.length===0){
-throw new Error(`You must provide a url to the runner. '${opts.url}' provided.`);
+if(typeof runOpts.url!=='string'||runOpts.url.length===0){
+throw new Error(`You must provide a url to the runner. '${runOpts.url}' provided.`);
 }
 
 try{
 
-requestedUrl=new URL(opts.url).href;
+requestedUrl=new URL(runOpts.url).href;
 }catch(e){
 throw new Error('The url provided should have a proper protocol and hostname.');
 }
 
-artifacts=await Runner._gatherArtifactsFromBrowser(requestedUrl,opts,connection);
+artifacts=await Runner._gatherArtifactsFromBrowser(requestedUrl,runOpts,connection);
 
 if(settings.gatherMode){
 const path=Runner._getArtifactsPath(settings);
@@ -24709,10 +43151,11 @@
 if(settings.gatherMode&&!settings.auditMode)return;
 
 
-if(!opts.config.audits){
+if(!runOpts.config.audits){
 throw new Error('No audits to evaluate.');
 }
-const auditResults=await Runner._runAudits(settings,opts.config.audits,artifacts);
+const auditResults=await Runner._runAudits(settings,runOpts.config.audits,artifacts,
+lighthouseRunWarnings);
 
 
 log.log('status','Generating results...');
@@ -24722,7 +43165,6 @@
 }
 
 
-
 const lighthouseVersion=require('../package.json').version;
 
 
@@ -24733,29 +43175,41 @@
 
 
 let categories={};
-if(opts.config.categories){
-categories=ReportScoring.scoreAllCategories(opts.config.categories,resultsById);
+if(runOpts.config.categories){
+categories=ReportScoring.scoreAllCategories(runOpts.config.categories,resultsById);
 }
 
 
 const lhr={
-userAgent:artifacts.UserAgent,
+userAgent:artifacts.HostUserAgent,
+environment:{
+networkUserAgent:artifacts.NetworkUserAgent,
+hostUserAgent:artifacts.HostUserAgent,
+benchmarkIndex:artifacts.BenchmarkIndex},
+
 lighthouseVersion,
 fetchTime:artifacts.fetchTime,
 requestedUrl:requestedUrl,
 finalUrl:artifacts.URL.finalUrl,
 runWarnings:lighthouseRunWarnings,
+runtimeError:Runner.getArtifactRuntimeError(artifacts),
 audits:resultsById,
 configSettings:settings,
 categories,
-categoryGroups:opts.config.groups||undefined,
-timing:{total:Date.now()-startTime}};
+categoryGroups:runOpts.config.groups||undefined,
+timing:{total:Date.now()-startTime},
+i18n:{
+rendererFormattedStrings:i18n.getRendererFormattedStrings(settings.locale),
+icuMessagePaths:{}}};
 
 
+
+
+lhr.i18n.icuMessagePaths=i18n.replaceIcuMessageInstanceIds(lhr,settings.locale);
+
 const report=generateReport(lhr,settings.output);
 return{lhr,artifacts,report};
 }catch(err){
-
 await Sentry.captureException(err,{level:'fatal'});
 throw err;
 }
@@ -24790,12 +43244,18 @@
 
 
 
-static async _runAudits(settings,audits,artifacts){
+
+static async _runAudits(settings,audits,artifacts,runWarnings){
 log.log('status','Analyzing and running audits...');
 artifacts=Object.assign({},Runner.instantiateComputedArtifacts(),artifacts);
 
 if(artifacts.settings){
-const overrides={gatherMode:undefined,auditMode:undefined,output:undefined};
+const overrides={
+locale:undefined,
+gatherMode:undefined,
+auditMode:undefined,
+output:undefined};
+
 const normalizedGatherSettings=Object.assign({},artifacts.settings,overrides);
 const normalizedAuditSettings=Object.assign({},settings,overrides);
 
@@ -24806,9 +43266,16 @@
 }
 
 
+const sharedAuditContext={
+settings,
+LighthouseRunWarnings:runWarnings,
+computedCache:new Map()};
+
+
+
 const auditResults=[];
 for(const auditDefn of audits){
-const auditResult=await Runner._runAudit(auditDefn,artifacts,settings);
+const auditResult=await Runner._runAudit(auditDefn,artifacts,sharedAuditContext);
 auditResults.push(auditResult);
 }
 
@@ -24824,9 +43291,9 @@
 
 
 
-static async _runAudit(auditDefn,artifacts,settings){
+static async _runAudit(auditDefn,artifacts,sharedAuditContext){
 const audit=auditDefn.implementation;
-const status=`Evaluating: ${audit.meta.title}`;
+const status=`Evaluating: ${i18n.getFormatted(audit.meta.title,'en-US')}`;
 
 log.log('status',status);
 let auditResult;
@@ -24852,7 +43319,6 @@
 
 const artifactError=artifacts[artifactName];
 
-
 Sentry.captureException(artifactError,{
 tags:{gatherer:artifactName},
 level:'error'});
@@ -24872,7 +43338,12 @@
 
 
 const auditOptions=Object.assign({},audit.defaultOptions,auditDefn.options);
-const product=await audit.audit(artifacts,{options:auditOptions,settings:settings});
+const auditContext={
+options:auditOptions,
+...sharedAuditContext};
+
+
+const product=await audit.audit(artifacts,auditContext);
 auditResult=Audit.generateAuditResult(audit,product);
 }catch(err){
 log.warn(audit.meta.id,`Caught exception: ${err.message}`);
@@ -24880,7 +43351,6 @@
 throw err;
 }
 
-
 Sentry.captureException(err,{tags:{audit:audit.meta.id},level:'error'});
 
 const errorMessage=err.friendlyMessage?
@@ -24897,6 +43367,29 @@
 
 
 
+
+static getArtifactRuntimeError(artifacts){
+for(const possibleErrorArtifact of Object.values(artifacts)){
+if(possibleErrorArtifact instanceof LHError&&possibleErrorArtifact.lhrRuntimeError){
+const errorMessage=possibleErrorArtifact.friendlyMessage||possibleErrorArtifact.message;
+
+return{
+code:possibleErrorArtifact.code,
+message:errorMessage};
+
+}
+}
+
+return{
+code:LHError.NO_ERROR,
+message:''};
+
+}
+
+
+
+
+
 static getAuditList(){
 const ignoredFiles=[
 'audit.js',
@@ -24908,14 +43401,14 @@
 
 
 const fileList=[
-...["accessibility","audit.js","bootup-time.js","byte-efficiency","content-width.js","critical-request-chains.js","deprecations.js","dobetterweb","errors-in-console.js","font-display.js","image-aspect-ratio.js","is-on-https.js","load-fast-enough-for-pwa.js","mainthread-work-breakdown.js","manifest-short-name-length.js","manual","metrics","metrics.js","mixed-content.js","multi-check-audit.js","network-requests.js","predictive-perf.js","redirects-http.js","redirects.js","screenshot-thumbnails.js","seo","service-worker.js","splash-screen.js","themed-omnibox.js","time-to-first-byte.js","user-timings.js","uses-rel-preconnect.js","uses-rel-preload.js","viewport.js","violation-audit.js","webapp-install-banner.js","without-javascript.js","works-offline.js"],
-...["appcache-manifest.js","doctype.js","dom-size.js","external-anchors-use-rel-noopener.js","geolocation-on-start.js","no-document-write.js","no-vulnerable-libraries.js","no-websql.js","notification-on-start.js","password-inputs-can-be-pasted-into.js","uses-http2.js","uses-passive-event-listeners.js"].map(f=>`dobetterweb/${f}`),
+...["accessibility","audit.js","bootup-time.js","byte-efficiency","content-width.js","critical-request-chains.js","deprecations.js","dobetterweb","errors-in-console.js","final-screenshot.js","font-display.js","image-aspect-ratio.js","is-on-https.js","load-fast-enough-for-pwa.js","mainthread-work-breakdown.js","manifest-short-name-length.js","manual","metrics","metrics.js","mixed-content.js","multi-check-audit.js","network-requests.js","predictive-perf.js","redirects-http.js","redirects.js","screenshot-thumbnails.js","seo","service-worker.js","splash-screen.js","themed-omnibox.js","time-to-first-byte.js","user-timings.js","uses-rel-preconnect.js","uses-rel-preload.js","viewport.js","violation-audit.js","webapp-install-banner.js","without-javascript.js","works-offline.js"],
+...["appcache-manifest.js","doctype.js","dom-size.js","external-anchors-use-rel-noopener.js","geolocation-on-start.js","js-libraries.js","no-document-write.js","no-vulnerable-libraries.js","no-websql.js","notification-on-start.js","password-inputs-can-be-pasted-into.js","uses-http2.js","uses-passive-event-listeners.js"].map(f=>`dobetterweb/${f}`),
 ...["estimated-input-latency.js","first-contentful-paint.js","first-cpu-idle.js","first-meaningful-paint.js","interactive.js","speed-index.js"].map(f=>`metrics/${f}`),
 ...["canonical.js","font-size.js","hreflang.js","http-status-code.js","is-crawlable.js","link-text.js","manual","meta-description.js","plugins.js","robots-txt.js"].map(f=>`seo/${f}`),
 ...["mobile-friendly.js","structured-data.js"].map(f=>`seo/manual/${f}`),
 ...["accesskeys.js","aria-allowed-attr.js","aria-required-attr.js","aria-required-children.js","aria-required-parent.js","aria-roles.js","aria-valid-attr-value.js","aria-valid-attr.js","audio-caption.js","axe-audit.js","button-name.js","bypass.js","color-contrast.js","definition-list.js","dlitem.js","document-title.js","duplicate-id.js","frame-title.js","html-has-lang.js","html-lang-valid.js","image-alt.js","input-image-alt.js","label.js","layout-table.js","link-name.js","list.js","listitem.js","manual","meta-refresh.js","meta-viewport.js","object-alt.js","tabindex.js","td-headers-attr.js","th-has-data-cells.js","valid-lang.js","video-caption.js","video-description.js"].
 map(f=>`accessibility/${f}`),
-...["custom-controls-labels.js","custom-controls-roles.js","focus-traps.js","focusable-controls.js","heading-levels.js","logical-tab-order.js","managed-focus.js","offscreen-content-hidden.js","use-landmarks.js","visual-order-follows-dom.js"].
+...["custom-controls-labels.js","custom-controls-roles.js","focus-traps.js","focusable-controls.js","heading-levels.js","interactive-element-affordance.js","logical-tab-order.js","managed-focus.js","offscreen-content-hidden.js","use-landmarks.js","visual-order-follows-dom.js"].
 map(f=>`accessibility/manual/${f}`),
 ...["byte-efficiency-audit.js","efficient-animated-content.js","offscreen-images.js","render-blocking-resources.js","total-byte-weight.js","unminified-css.js","unminified-javascript.js","unused-css-rules.js","unused-javascript.js","uses-long-cache-ttl.js","uses-optimized-images.js","uses-responsive-images.js","uses-text-compression.js","uses-webp-images.js"].
 map(f=>`byte-efficiency/${f}`),
@@ -24949,11 +43442,15 @@
 'computed-artifact.js',
 'metrics',
 'metrics/lantern-metric.js',
-'metrics/metric.js'];
+'metrics/metric.js',
+
+
+'new-computed-artifact.js',
+'manifest-values.js'];
 
 
 const fileList=[
-...["computed-artifact.js","critical-request-chains.js","load-simulator.js","main-resource.js","main-thread-tasks.js","manifest-values.js","metrics","network-analysis.js","network-records.js","network-throughput.js","page-dependency-graph.js","pushed-requests.js","screenshots.js","speedline.js","trace-of-tab.js"],
+...["computed-artifact.js","critical-request-chains.js","load-simulator.js","main-resource.js","main-thread-tasks.js","manifest-values.js","metrics","network-analysis.js","network-records.js","network-throughput.js","new-computed-artifact.js","page-dependency-graph.js","pushed-requests.js","screenshots.js","speedline.js","trace-of-tab.js"],
 ...["estimated-input-latency.js","first-contentful-paint.js","first-cpu-idle.js","first-meaningful-paint.js","interactive.js","lantern-estimated-input-latency.js","lantern-first-contentful-paint.js","lantern-first-cpu-idle.js","lantern-first-meaningful-paint.js","lantern-interactive.js","lantern-metric.js","lantern-speed-index.js","metric.js","speed-index.js"].map(f=>`metrics/${f}`)];
 
 
@@ -24972,6 +43469,7 @@
 const ArtifactClass=require('./gather/computed/'+filename);
 const artifact=new ArtifactClass(computedArtifacts);
 
+
 computedArtifacts['request'+artifact.name]=artifact.request.bind(artifact);
 });
 
@@ -25043,7 +43541,7 @@
 module.exports=Runner;
 
 }).call(this,require('_process'),"/../lighthouse-core");
-},{"../package.json":136,"./audits/audit":2,"./gather/driver.js":17,"./gather/gather-runner":18,"./lib/asset-saver":21,"./lib/sentry":40,"./lib/url-shim":"url","./report/report-generator":49,"./scoring":51,"_process":77,"lighthouse-logger":125,"lodash.isequal":126,"path":75}],51:[function(require,module,exports){
+},{"../package.json":188,"./audits/audit":2,"./gather/driver.js":19,"./gather/gather-runner":20,"./lib/asset-saver":24,"./lib/i18n/i18n.js":36,"./lib/lh-error.js":85,"./lib/sentry":90,"./lib/url-shim":"url","./report/report-generator":98,"./scoring":100,"_process":126,"lighthouse-logger":147,"lodash.isequal":178,"path":124}],100:[function(require,module,exports){
 
 
 
@@ -25096,6 +43594,7 @@
 
 
 static scoreAllCategories(configCategories,resultsByAuditId){
+
 const scoredCategories={};
 
 for(const[categoryId,configCategory]of Object.entries(configCategories)){
@@ -25137,7 +43636,7 @@
 
 module.exports=ReportScoring;
 
-},{"./audits/audit":2}],52:[function(require,module,exports){
+},{"./audits/audit":2}],101:[function(require,module,exports){
 
 
 
@@ -25145,10 +43644,11 @@
 
 'use strict';
 
+const lighthouse=require('../../../lighthouse-core/index');
 const RawProtocol=require('../../../lighthouse-core/gather/connections/raw');
-const Runner=require('../../../lighthouse-core/runner');
 const Config=require('../../../lighthouse-core/config/config');
 const defaultConfig=require('../../../lighthouse-core/config/default-config.js');
+const i18n=require('../../../lighthouse-core/lib/i18n/i18n.js');
 const log=require('lighthouse-logger');
 
 
@@ -25159,29 +43659,13 @@
 
 
 
-
-
-function runLighthouseForConnection(
-connection,url,options,categoryIDs,
-updateBadgeFn=function(){}){
-const config=new Config({
+function getDefaultConfigForCategories(categoryIDs){
+return{
 extends:'lighthouse:default',
-settings:{onlyCategories:categoryIDs}},
-options.flags);
+settings:{
+onlyCategories:categoryIDs}};
 
 
-const runOptions=Object.assign({},options,{url,config});
-updateBadgeFn(url);
-
-return Runner.run(connection,runOptions).
-then(result=>{
-updateBadgeFn();
-return result;
-}).
-catch(err=>{
-updateBadgeFn();
-throw err;
-});
 }
 
 
@@ -25191,11 +43675,13 @@
 
 
 
-function runLighthouseInWorker(port,url,options,categoryIDs){
+function runLighthouseInWorker(port,url,flags,categoryIDs){
 
-log.setLevel('info');
+flags.logLevel=flags.logLevel||'info';
+const config=getDefaultConfigForCategories(categoryIDs);
 const connection=new RawProtocol(port);
-return runLighthouseForConnection(connection,url,options,categoryIDs);
+
+return lighthouse(url,flags,config,connection);
 }
 
 
@@ -25203,7 +43689,9 @@
 
 
 function getDefaultCategories(){
-return Config.getCategories(defaultConfig);
+const categories=Config.getCategories(defaultConfig);
+categories.forEach(cat=>cat.title=i18n.getFormatted(cat.title,'en-US'));
+return categories;
 }
 
 
@@ -25214,22 +43702,23 @@
 if(typeof module!=='undefined'&&module.exports){
 
 module.exports={
-runLighthouseForConnection,
+getDefaultConfigForCategories,
 runLighthouseInWorker,
 getDefaultCategories,
 listenForStatus};
 
 }
 
-if(typeof window!=='undefined'){
 
 
-window.runLighthouseInWorker=runLighthouseInWorker;
+if(typeof self!=='undefined'&&self instanceof self.WorkerGlobalScope){
 
-window.listenForStatus=listenForStatus;
+self.runLighthouseInWorker=runLighthouseInWorker;
+
+self.listenForStatus=listenForStatus;
 }
 
-},{"../../../lighthouse-core/config/config":7,"../../../lighthouse-core/config/default-config.js":9,"../../../lighthouse-core/gather/connections/raw":15,"../../../lighthouse-core/runner":50,"lighthouse-logger":125}],53:[function(require,module,exports){
+},{"../../../lighthouse-core/config/config":7,"../../../lighthouse-core/config/default-config.js":9,"../../../lighthouse-core/gather/connections/raw":17,"../../../lighthouse-core/index":22,"../../../lighthouse-core/lib/i18n/i18n.js":36,"lighthouse-logger":147}],102:[function(require,module,exports){
 (function(global){
 'use strict';
 
@@ -25723,7 +44212,7 @@
 };
 
 }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"util/":97}],54:[function(require,module,exports){
+},{"util/":146}],103:[function(require,module,exports){
 'use strict';
 
 exports.byteLength=byteLength;
@@ -25876,9 +44365,9 @@
 return parts.join('');
 }
 
-},{}],55:[function(require,module,exports){
+},{}],104:[function(require,module,exports){
 
-},{}],56:[function(require,module,exports){
+},{}],105:[function(require,module,exports){
 (function(process,Buffer){
 'use strict';
 
@@ -26290,7 +44779,7 @@
 
 exports.Zlib=Zlib;
 }).call(this,require('_process'),require("buffer").Buffer);
-},{"_process":77,"assert":53,"buffer":60,"pako/lib/zlib/constants":69,"pako/lib/zlib/deflate.js":71,"pako/lib/zlib/inflate.js":58,"pako/lib/zlib/zstream":74}],57:[function(require,module,exports){
+},{"_process":126,"assert":102,"buffer":109,"pako/lib/zlib/constants":118,"pako/lib/zlib/deflate.js":120,"pako/lib/zlib/inflate.js":107,"pako/lib/zlib/zstream":123}],106:[function(require,module,exports){
 (function(process){
 'use strict';
 
@@ -26902,9 +45391,9 @@
 util.inherits(InflateRaw,Zlib);
 util.inherits(Unzip,Zlib);
 }).call(this,require('_process'));
-},{"./binding":56,"_process":77,"assert":53,"buffer":60,"stream":92,"util":97}],58:[function(require,module,exports){
-arguments[4][55][0].apply(exports,arguments);
-},{"dup":55}],59:[function(require,module,exports){
+},{"./binding":105,"_process":126,"assert":102,"buffer":109,"stream":141,"util":146}],107:[function(require,module,exports){
+arguments[4][104][0].apply(exports,arguments);
+},{"dup":104}],108:[function(require,module,exports){
 (function(global){
 'use strict';
 
@@ -27016,7 +45505,7 @@
 };
 
 }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"buffer":60}],60:[function(require,module,exports){
+},{"buffer":109}],109:[function(require,module,exports){
 
 
 
@@ -28754,7 +47243,7 @@
 return obj!==obj;
 }
 
-},{"base64-js":54,"ieee754":63}],61:[function(require,module,exports){
+},{"base64-js":103,"ieee754":112}],110:[function(require,module,exports){
 (function(Buffer){
 
 
@@ -28865,7 +47354,7 @@
 }
 
 }).call(this,{"isBuffer":require("../../is-buffer/index.js")});
-},{"../../is-buffer/index.js":65}],62:[function(require,module,exports){
+},{"../../is-buffer/index.js":114}],111:[function(require,module,exports){
 
 
 
@@ -29386,7 +47875,7 @@
 };
 }
 
-},{}],63:[function(require,module,exports){
+},{}],112:[function(require,module,exports){
 exports.read=function(buffer,offset,isLE,mLen,nBytes){
 var e,m;
 var eLen=nBytes*8-mLen-1;
@@ -29472,7 +47961,7 @@
 buffer[offset+i-d]|=s*128;
 };
 
-},{}],64:[function(require,module,exports){
+},{}],113:[function(require,module,exports){
 if(typeof Object.create==='function'){
 
 module.exports=function inherits(ctor,superCtor){
@@ -29497,7 +47986,7 @@
 };
 }
 
-},{}],65:[function(require,module,exports){
+},{}],114:[function(require,module,exports){
 
 
 
@@ -29520,14 +48009,14 @@
 return typeof obj.readFloatLE==='function'&&typeof obj.slice==='function'&&isBuffer(obj.slice(0,0));
 }
 
-},{}],66:[function(require,module,exports){
+},{}],115:[function(require,module,exports){
 var toString={}.toString;
 
 module.exports=Array.isArray||function(arr){
 return toString.call(arr)=='[object Array]';
 };
 
-},{}],67:[function(require,module,exports){
+},{}],116:[function(require,module,exports){
 'use strict';
 
 
@@ -29634,7 +48123,7 @@
 
 exports.setTyped(TYPED_OK);
 
-},{}],68:[function(require,module,exports){
+},{}],117:[function(require,module,exports){
 'use strict';
 
 
@@ -29687,7 +48176,7 @@
 
 module.exports=adler32;
 
-},{}],69:[function(require,module,exports){
+},{}],118:[function(require,module,exports){
 'use strict';
 
 
@@ -29757,7 +48246,7 @@
 
 
 
-},{}],70:[function(require,module,exports){
+},{}],119:[function(require,module,exports){
 'use strict';
 
 
@@ -29818,7 +48307,7 @@
 
 module.exports=crc32;
 
-},{}],71:[function(require,module,exports){
+},{}],120:[function(require,module,exports){
 'use strict';
 
 
@@ -31694,7 +50183,7 @@
 
 
 
-},{"../utils/common":67,"./adler32":68,"./crc32":70,"./messages":72,"./trees":73}],72:[function(require,module,exports){
+},{"../utils/common":116,"./adler32":117,"./crc32":119,"./messages":121,"./trees":122}],121:[function(require,module,exports){
 'use strict';
 
 
@@ -31728,7 +50217,7 @@
 '-6':'incompatible version'};
 
 
-},{}],73:[function(require,module,exports){
+},{}],122:[function(require,module,exports){
 'use strict';
 
 
@@ -32950,7 +51439,7 @@
 exports._tr_tally=_tr_tally;
 exports._tr_align=_tr_align;
 
-},{"../utils/common":67}],74:[function(require,module,exports){
+},{"../utils/common":116}],123:[function(require,module,exports){
 'use strict';
 
 
@@ -32999,7 +51488,7 @@
 
 module.exports=ZStream;
 
-},{}],75:[function(require,module,exports){
+},{}],124:[function(require,module,exports){
 (function(process){
 
 
@@ -33227,7 +51716,7 @@
 
 
 }).call(this,require('_process'));
-},{"_process":77}],76:[function(require,module,exports){
+},{"_process":126}],125:[function(require,module,exports){
 (function(process){
 'use strict';
 
@@ -33274,7 +51763,7 @@
 }
 
 }).call(this,require('_process'));
-},{"_process":77}],77:[function(require,module,exports){
+},{"_process":126}],126:[function(require,module,exports){
 
 var process=module.exports={};
 
@@ -33460,7 +51949,7 @@
 };
 process.umask=function(){return 0;};
 
-},{}],78:[function(require,module,exports){
+},{}],127:[function(require,module,exports){
 
 
 
@@ -33546,7 +52035,7 @@
 return Object.prototype.toString.call(xs)==='[object Array]';
 };
 
-},{}],79:[function(require,module,exports){
+},{}],128:[function(require,module,exports){
 
 
 
@@ -33633,16 +52122,16 @@
 return res;
 };
 
-},{}],80:[function(require,module,exports){
+},{}],129:[function(require,module,exports){
 'use strict';
 
 exports.decode=exports.parse=require('./decode');
 exports.encode=exports.stringify=require('./encode');
 
-},{"./decode":78,"./encode":79}],81:[function(require,module,exports){
+},{"./decode":127,"./encode":128}],130:[function(require,module,exports){
 module.exports=require("./lib/_stream_duplex.js");
 
-},{"./lib/_stream_duplex.js":82}],82:[function(require,module,exports){
+},{"./lib/_stream_duplex.js":131}],131:[function(require,module,exports){
 
 
 
@@ -33718,7 +52207,7 @@
 f(xs[i],i);
 }
 }
-},{"./_stream_readable":84,"./_stream_writable":86,"core-util-is":61,"inherits":64,"process-nextick-args":76}],83:[function(require,module,exports){
+},{"./_stream_readable":133,"./_stream_writable":135,"core-util-is":110,"inherits":113,"process-nextick-args":125}],132:[function(require,module,exports){
 
 
 
@@ -33745,7 +52234,7 @@
 PassThrough.prototype._transform=function(chunk,encoding,cb){
 cb(null,chunk);
 };
-},{"./_stream_transform":85,"core-util-is":61,"inherits":64}],84:[function(require,module,exports){
+},{"./_stream_transform":134,"core-util-is":110,"inherits":113}],133:[function(require,module,exports){
 (function(process){
 'use strict';
 
@@ -34689,7 +53178,7 @@
 return-1;
 }
 }).call(this,require('_process'));
-},{"./_stream_duplex":82,"./internal/streams/BufferList":87,"_process":77,"buffer":60,"buffer-shims":59,"core-util-is":61,"events":62,"inherits":64,"isarray":66,"process-nextick-args":76,"string_decoder/":93,"util":55}],85:[function(require,module,exports){
+},{"./_stream_duplex":131,"./internal/streams/BufferList":136,"_process":126,"buffer":109,"buffer-shims":108,"core-util-is":110,"events":111,"inherits":113,"isarray":115,"process-nextick-args":125,"string_decoder/":142,"util":104}],134:[function(require,module,exports){
 
 
 
@@ -34872,7 +53361,7 @@
 
 return stream.push(null);
 }
-},{"./_stream_duplex":82,"core-util-is":61,"inherits":64}],86:[function(require,module,exports){
+},{"./_stream_duplex":131,"core-util-is":110,"inherits":113}],135:[function(require,module,exports){
 (function(process){
 
 
@@ -35429,7 +53918,7 @@
 };
 }
 }).call(this,require('_process'));
-},{"./_stream_duplex":82,"_process":77,"buffer":60,"buffer-shims":59,"core-util-is":61,"events":62,"inherits":64,"process-nextick-args":76,"util-deprecate":94}],87:[function(require,module,exports){
+},{"./_stream_duplex":131,"_process":126,"buffer":109,"buffer-shims":108,"core-util-is":110,"events":111,"inherits":113,"process-nextick-args":125,"util-deprecate":143}],136:[function(require,module,exports){
 'use strict';
 
 var Buffer=require('buffer').Buffer;
@@ -35494,10 +53983,10 @@
 }
 return ret;
 };
-},{"buffer":60,"buffer-shims":59}],88:[function(require,module,exports){
+},{"buffer":109,"buffer-shims":108}],137:[function(require,module,exports){
 module.exports=require("./lib/_stream_passthrough.js");
 
-},{"./lib/_stream_passthrough.js":83}],89:[function(require,module,exports){
+},{"./lib/_stream_passthrough.js":132}],138:[function(require,module,exports){
 (function(process){
 var Stream=function(){
 try{
@@ -35517,13 +54006,13 @@
 }
 
 }).call(this,require('_process'));
-},{"./lib/_stream_duplex.js":82,"./lib/_stream_passthrough.js":83,"./lib/_stream_readable.js":84,"./lib/_stream_transform.js":85,"./lib/_stream_writable.js":86,"_process":77}],90:[function(require,module,exports){
+},{"./lib/_stream_duplex.js":131,"./lib/_stream_passthrough.js":132,"./lib/_stream_readable.js":133,"./lib/_stream_transform.js":134,"./lib/_stream_writable.js":135,"_process":126}],139:[function(require,module,exports){
 module.exports=require("./lib/_stream_transform.js");
 
-},{"./lib/_stream_transform.js":85}],91:[function(require,module,exports){
+},{"./lib/_stream_transform.js":134}],140:[function(require,module,exports){
 module.exports=require("./lib/_stream_writable.js");
 
-},{"./lib/_stream_writable.js":86}],92:[function(require,module,exports){
+},{"./lib/_stream_writable.js":135}],141:[function(require,module,exports){
 
 
 
@@ -35652,7 +54141,7 @@
 return dest;
 };
 
-},{"events":62,"inherits":64,"readable-stream/duplex.js":81,"readable-stream/passthrough.js":88,"readable-stream/readable.js":89,"readable-stream/transform.js":90,"readable-stream/writable.js":91}],93:[function(require,module,exports){
+},{"events":111,"inherits":113,"readable-stream/duplex.js":130,"readable-stream/passthrough.js":137,"readable-stream/readable.js":138,"readable-stream/transform.js":139,"readable-stream/writable.js":140}],142:[function(require,module,exports){
 
 
 
@@ -35875,7 +54364,7 @@
 this.charLength=this.charReceived?3:0;
 }
 
-},{"buffer":60}],94:[function(require,module,exports){
+},{"buffer":109}],143:[function(require,module,exports){
 (function(global){
 
 
@@ -35946,16 +54435,16 @@
 }
 
 }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{}],95:[function(require,module,exports){
-arguments[4][64][0].apply(exports,arguments);
-},{"dup":64}],96:[function(require,module,exports){
+},{}],144:[function(require,module,exports){
+arguments[4][113][0].apply(exports,arguments);
+},{"dup":113}],145:[function(require,module,exports){
 module.exports=function isBuffer(arg){
 return arg&&typeof arg==='object'&&
 typeof arg.copy==='function'&&
 typeof arg.fill==='function'&&
 typeof arg.readUInt8==='function';
 };
-},{}],97:[function(require,module,exports){
+},{}],146:[function(require,module,exports){
 (function(process,global){
 
 
@@ -36545,7 +55034,866 @@
 }
 
 }).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"./support/isBuffer":96,"_process":77,"inherits":95}],98:[function(require,module,exports){
+},{"./support/isBuffer":145,"_process":126,"inherits":144}],147:[function(require,module,exports){
+(function(process){
+
+
+
+
+
+'use strict';
+
+const debug=require('debug');
+const marky=require('marky');
+
+const EventEmitter=require('events').EventEmitter;
+const isWindows=process.platform==='win32';
+
+
+const isBrowser=process.browser;
+
+const colors={
+red:isBrowser?'crimson':1,
+yellow:isBrowser?'gold':3,
+cyan:isBrowser?'darkturquoise':6,
+green:isBrowser?'forestgreen':2,
+blue:isBrowser?'steelblue':4,
+magenta:isBrowser?'palevioletred':5};
+
+
+
+debug.colors=[colors.cyan,colors.green,colors.blue,colors.magenta];
+
+class Emitter extends EventEmitter{
+
+
+
+
+
+
+issueStatus(title,argsArray){
+if(title==='status'||title==='statusEnd'){
+this.emit(title,[title,...argsArray]);
+}
+}
+
+
+
+
+
+
+
+issueWarning(title,argsArray){
+this.emit('warning',[title,...argsArray]);
+}}
+
+
+const loggersByTitle={};
+const loggingBufferColumns=25;
+
+class Log{
+static _logToStdErr(title,argsArray){
+const log=Log.loggerfn(title);
+log(...argsArray);
+}
+
+static loggerfn(title){
+let log=loggersByTitle[title];
+if(!log){
+log=debug(title);
+loggersByTitle[title]=log;
+
+if(title.endsWith('error')){
+log.color=colors.red;
+}else if(title.endsWith('warn')){
+log.color=colors.yellow;
+}
+}
+return log;
+}
+
+static setLevel(level){
+switch(level){
+case'silent':
+debug.enable('-*');
+break;
+case'verbose':
+debug.enable('*');
+break;
+case'error':
+debug.enable('-*, *:error');
+break;
+default:
+debug.enable('*, -*:verbose');}
+
+}
+
+
+
+
+
+
+
+static formatProtocol(prefix,data,level){
+const columns=!process||process.browser?Infinity:process.stdout.columns;
+const method=data.method||'?????';
+const maxLength=columns-method.length-prefix.length-loggingBufferColumns;
+
+const snippet=data.params&&method!=='IO.read'?
+JSON.stringify(data.params).substr(0,maxLength):'';
+Log._logToStdErr(`${prefix}:${level||''}`,[method,snippet]);
+}
+
+static time({msg,id,args=[]},level='log'){
+marky.mark(id);
+Log[level]('status',msg,...args);
+}
+
+static timeEnd({msg,id,args=[]},level='verbose'){
+Log[level]('statusEnd',msg,...args);
+marky.stop(id);
+}
+
+static log(title,...args){
+Log.events.issueStatus(title,args);
+return Log._logToStdErr(title,args);
+}
+
+static warn(title,...args){
+Log.events.issueWarning(title,args);
+return Log._logToStdErr(`${title}:warn`,args);
+}
+
+static error(title,...args){
+return Log._logToStdErr(`${title}:error`,args);
+}
+
+static verbose(title,...args){
+Log.events.issueStatus(title,args);
+return Log._logToStdErr(`${title}:verbose`,args);
+}
+
+
+
+
+
+
+static greenify(str){
+return`${Log.green}${str}${Log.reset}`;
+}
+
+
+
+
+
+
+static redify(str){
+return`${Log.red}${str}${Log.reset}`;
+}
+
+static get green(){
+return'\x1B[32m';
+}
+
+static get red(){
+return'\x1B[31m';
+}
+
+static get yellow(){
+return'\x1b[33m';
+}
+
+static get purple(){
+return'\x1b[95m';
+}
+
+static get reset(){
+return'\x1B[0m';
+}
+
+static get bold(){
+return'\x1b[1m';
+}
+
+static get dim(){
+return'\x1b[2m';
+}
+
+static get tick(){
+return isWindows?'\u221A':'✓';
+}
+
+static get cross(){
+return isWindows?'\u00D7':'✘';
+}
+
+static get whiteSmallSquare(){
+return isWindows?'\u0387':'▫';
+}
+
+static get heavyHorizontal(){
+return isWindows?'\u2500':'━';
+}
+
+static get heavyVertical(){
+return isWindows?'\u2502 ':'┃ ';
+}
+
+static get heavyUpAndRight(){
+return isWindows?'\u2514':'┗';
+}
+
+static get heavyVerticalAndRight(){
+return isWindows?'\u251C':'┣';
+}
+
+static get heavyDownAndHorizontal(){
+return isWindows?'\u252C':'┳';
+}
+
+static get doubleLightHorizontal(){
+return'──';
+}}
+
+
+Log.events=new Emitter();
+Log.takeTimeEntries=_=>{
+const entries=marky.getEntries();
+marky.clear();
+return entries;
+};
+
+module.exports=Log;
+
+}).call(this,require('_process'));
+},{"_process":126,"debug":148,"events":111,"marky":150}],148:[function(require,module,exports){
+(function(process){
+
+
+
+
+
+
+exports=module.exports=require('./debug');
+exports.log=log;
+exports.formatArgs=formatArgs;
+exports.save=save;
+exports.load=load;
+exports.useColors=useColors;
+exports.storage='undefined'!=typeof chrome&&
+'undefined'!=typeof chrome.storage?
+chrome.storage.local:
+localstorage();
+
+
+
+
+
+exports.colors=[
+'lightseagreen',
+'forestgreen',
+'goldenrod',
+'dodgerblue',
+'darkorchid',
+'crimson'];
+
+
+
+
+
+
+
+
+
+
+function useColors(){
+
+
+
+if(typeof window!=='undefined'&&window.process&&window.process.type==='renderer'){
+return true;
+}
+
+
+
+return typeof document!=='undefined'&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||
+
+typeof window!=='undefined'&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||
+
+
+typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||
+
+typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
+}
+
+
+
+
+
+exports.formatters.j=function(v){
+try{
+return JSON.stringify(v);
+}catch(err){
+return'[UnexpectedJSONParseError]: '+err.message;
+}
+};
+
+
+
+
+
+
+
+
+function formatArgs(args){
+var useColors=this.useColors;
+
+args[0]=(useColors?'%c':'')+
+this.namespace+(
+useColors?' %c':' ')+
+args[0]+(
+useColors?'%c ':' ')+
+'+'+exports.humanize(this.diff);
+
+if(!useColors)return;
+
+var c='color: '+this.color;
+args.splice(1,0,c,'color: inherit');
+
+
+
+
+var index=0;
+var lastC=0;
+args[0].replace(/%[a-zA-Z%]/g,function(match){
+if('%%'===match)return;
+index++;
+if('%c'===match){
+
+
+lastC=index;
+}
+});
+
+args.splice(lastC,0,c);
+}
+
+
+
+
+
+
+
+
+function log(){
+
+
+return'object'===typeof console&&
+console.log&&
+Function.prototype.apply.call(console.log,console,arguments);
+}
+
+
+
+
+
+
+
+
+function save(namespaces){
+try{
+if(null==namespaces){
+exports.storage.removeItem('debug');
+}else{
+exports.storage.debug=namespaces;
+}
+}catch(e){}
+}
+
+
+
+
+
+
+
+
+function load(){
+var r;
+try{
+r=exports.storage.debug;
+}catch(e){}
+
+
+if(!r&&typeof process!=='undefined'&&'env'in process){
+r=process.env.DEBUG;
+}
+
+return r;
+}
+
+
+
+
+
+exports.enable(load());
+
+
+
+
+
+
+
+
+
+
+
+
+function localstorage(){
+try{
+return window.localStorage;
+}catch(e){}
+}
+
+}).call(this,require('_process'));
+},{"./debug":149,"_process":126}],149:[function(require,module,exports){
+
+
+
+
+
+
+
+
+exports=module.exports=createDebug.debug=createDebug['default']=createDebug;
+exports.coerce=coerce;
+exports.disable=disable;
+exports.enable=enable;
+exports.enabled=enabled;
+exports.humanize=require('ms');
+
+
+
+
+
+exports.names=[];
+exports.skips=[];
+
+
+
+
+
+
+
+exports.formatters={};
+
+
+
+
+
+var prevTime;
+
+
+
+
+
+
+
+
+function selectColor(namespace){
+var hash=0,i;
+
+for(i in namespace){
+hash=(hash<<5)-hash+namespace.charCodeAt(i);
+hash|=0;
+}
+
+return exports.colors[Math.abs(hash)%exports.colors.length];
+}
+
+
+
+
+
+
+
+
+
+function createDebug(namespace){
+
+function debug(){
+
+if(!debug.enabled)return;
+
+var self=debug;
+
+
+var curr=+new Date();
+var ms=curr-(prevTime||curr);
+self.diff=ms;
+self.prev=prevTime;
+self.curr=curr;
+prevTime=curr;
+
+
+var args=new Array(arguments.length);
+for(var i=0;i<args.length;i++){
+args[i]=arguments[i];
+}
+
+args[0]=exports.coerce(args[0]);
+
+if('string'!==typeof args[0]){
+
+args.unshift('%O');
+}
+
+
+var index=0;
+args[0]=args[0].replace(/%([a-zA-Z%])/g,function(match,format){
+
+if(match==='%%')return match;
+index++;
+var formatter=exports.formatters[format];
+if('function'===typeof formatter){
+var val=args[index];
+match=formatter.call(self,val);
+
+
+args.splice(index,1);
+index--;
+}
+return match;
+});
+
+
+exports.formatArgs.call(self,args);
+
+var logFn=debug.log||exports.log||console.log.bind(console);
+logFn.apply(self,args);
+}
+
+debug.namespace=namespace;
+debug.enabled=exports.enabled(namespace);
+debug.useColors=exports.useColors();
+debug.color=selectColor(namespace);
+
+
+if('function'===typeof exports.init){
+exports.init(debug);
+}
+
+return debug;
+}
+
+
+
+
+
+
+
+
+
+function enable(namespaces){
+exports.save(namespaces);
+
+exports.names=[];
+exports.skips=[];
+
+var split=(typeof namespaces==='string'?namespaces:'').split(/[\s,]+/);
+var len=split.length;
+
+for(var i=0;i<len;i++){
+if(!split[i])continue;
+namespaces=split[i].replace(/\*/g,'.*?');
+if(namespaces[0]==='-'){
+exports.skips.push(new RegExp('^'+namespaces.substr(1)+'$'));
+}else{
+exports.names.push(new RegExp('^'+namespaces+'$'));
+}
+}
+}
+
+
+
+
+
+
+
+function disable(){
+exports.enable('');
+}
+
+
+
+
+
+
+
+
+
+function enabled(name){
+var i,len;
+for(i=0,len=exports.skips.length;i<len;i++){
+if(exports.skips[i].test(name)){
+return false;
+}
+}
+for(i=0,len=exports.names.length;i<len;i++){
+if(exports.names[i].test(name)){
+return true;
+}
+}
+return false;
+}
+
+
+
+
+
+
+
+
+
+function coerce(val){
+if(val instanceof Error)return val.stack||val.message;
+return val;
+}
+
+},{"ms":151}],150:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports,'__esModule',{value:true});
+
+
+var perf=typeof performance!=='undefined'&&performance;
+
+var now=perf&&perf.now?function(){return perf.now();}:function(){return Date.now();};
+
+function throwIfEmpty(name){
+if(!name){
+throw new Error('name must be non-empty');
+}
+}
+
+
+function insertSorted(arr,item){
+var low=0;
+var high=arr.length;
+var mid;
+while(low<high){
+mid=low+high>>>1;
+if(arr[mid].startTime<item.startTime){
+low=mid+1;
+}else{
+high=mid;
+}
+}
+arr.splice(low,0,item);
+}
+
+if(perf&&perf.mark){
+exports.mark=function(name){
+throwIfEmpty(name);
+perf.mark("start "+name);
+};
+exports.stop=function(name){
+throwIfEmpty(name);
+perf.mark("end "+name);
+perf.measure(name,"start "+name,"end "+name);
+var entries=perf.getEntriesByName(name);
+return entries[entries.length-1];
+};
+exports.getEntries=function(){return perf.getEntriesByType('measure');};
+exports.clear=function(){
+perf.clearMarks();
+perf.clearMeasures();
+};
+}else{
+var marks={};
+var entries=[];
+exports.mark=function(name){
+throwIfEmpty(name);
+var startTime=now();
+marks['$'+name]=startTime;
+};
+exports.stop=function(name){
+throwIfEmpty(name);
+var endTime=now();
+var startTime=marks['$'+name];
+if(!startTime){
+throw new Error("no known mark: "+name);
+}
+var entry={
+startTime:startTime,
+name:name,
+duration:endTime-startTime,
+entryType:'measure'};
+
+
+
+
+insertSorted(entries,entry);
+return entry;
+};
+exports.getEntries=function(){return entries;};
+exports.clear=function(){entries=[];};
+}
+
+},{}],151:[function(require,module,exports){
+
+
+
+
+var s=1000;
+var m=s*60;
+var h=m*60;
+var d=h*24;
+var y=d*365.25;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+module.exports=function(val,options){
+options=options||{};
+var type=typeof val;
+if(type==='string'&&val.length>0){
+return parse(val);
+}else if(type==='number'&&isNaN(val)===false){
+return options.long?fmtLong(val):fmtShort(val);
+}
+throw new Error(
+'val is not a non-empty string or a valid number. val='+
+JSON.stringify(val));
+
+};
+
+
+
+
+
+
+
+
+
+function parse(str){
+str=String(str);
+if(str.length>100){
+return;
+}
+var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
+str);
+
+if(!match){
+return;
+}
+var n=parseFloat(match[1]);
+var type=(match[2]||'ms').toLowerCase();
+switch(type){
+case'years':
+case'year':
+case'yrs':
+case'yr':
+case'y':
+return n*y;
+case'days':
+case'day':
+case'd':
+return n*d;
+case'hours':
+case'hour':
+case'hrs':
+case'hr':
+case'h':
+return n*h;
+case'minutes':
+case'minute':
+case'mins':
+case'min':
+case'm':
+return n*m;
+case'seconds':
+case'second':
+case'secs':
+case'sec':
+case's':
+return n*s;
+case'milliseconds':
+case'millisecond':
+case'msecs':
+case'msec':
+case'ms':
+return n;
+default:
+return undefined;}
+
+}
+
+
+
+
+
+
+
+
+
+function fmtShort(ms){
+if(ms>=d){
+return Math.round(ms/d)+'d';
+}
+if(ms>=h){
+return Math.round(ms/h)+'h';
+}
+if(ms>=m){
+return Math.round(ms/m)+'m';
+}
+if(ms>=s){
+return Math.round(ms/s)+'s';
+}
+return ms+'ms';
+}
+
+
+
+
+
+
+
+
+
+function fmtLong(ms){
+return plural(ms,d,'day')||
+plural(ms,h,'hour')||
+plural(ms,m,'minute')||
+plural(ms,s,'second')||
+ms+' ms';
+}
+
+
+
+
+
+function plural(ms,n,name){
+if(ms<n){
+return;
+}
+if(ms<n*1.5){
+return Math.floor(ms/n)+' '+name;
+}
+return Math.ceil(ms/n)+' '+name+'s';
+}
+
+},{}],152:[function(require,module,exports){
 
 
 var langs=[
@@ -44689,7 +64037,14 @@
 return langs;
 };
 
-},{}],99:[function(require,module,exports){
+},{}],153:[function(require,module,exports){
+
+
+
+
+
+
+SDK.CSSMatchedStyles=class{
 
 
 
@@ -44700,823 +64055,500 @@
 
 
 
+constructor(
+cssModel,
+node,
+inlinePayload,
+attributesPayload,
+matchedPayload,
+pseudoPayload,
+inheritedPayload,
+animationsPayload){
+this._cssModel=cssModel;
+this._node=node;
+
+this._addedStyles=new Map();
+
+this._matchingSelectors=new Map();
+this._keyframes=[];
+if(animationsPayload)
+this._keyframes=animationsPayload.map(rule=>new SDK.CSSKeyframesRule(cssModel,rule));
 
 
+this._nodeForStyle=new Map();
+
+this._inheritedStyles=new Set();
+this._mainDOMCascade=this._buildMainCascade(inlinePayload,attributesPayload,matchedPayload,inheritedPayload);
+this._pseudoDOMCascades=this._buildPseudoCascades(pseudoPayload);
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.Color=function(rgba,format,originalText)
-{
-this._rgba=rgba;
-this._originalText=originalText||null;
-this._originalTextIsValid=!!this._originalText;
-this._format=format;
-if(typeof this._rgba[3]==="undefined")
-this._rgba[3]=1;
-
-for(var i=0;i<4;++i){
-if(this._rgba[i]<0){
-this._rgba[i]=0;
-this._originalTextIsValid=false;
-}
-if(this._rgba[i]>1){
-this._rgba[i]=1;
-this._originalTextIsValid=false;
-}
-}
-};
-
-
-WebInspector.Color.Regex=/((?:rgb|hsl)a?\([^)]+\)|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|\b[a-zA-Z]+\b(?!-))/g;
-
-
-
-
-WebInspector.Color.Format={
-Original:"original",
-Nickname:"nickname",
-HEX:"hex",
-ShortHEX:"shorthex",
-RGB:"rgb",
-RGBA:"rgba",
-HSL:"hsl",
-HSLA:"hsla"};
-
-
-
-
-
-
-WebInspector.Color.parse=function(text)
-{
-
-var value=text.toLowerCase().replace(/\s+/g,"");
-var simple=/^(?:#([0-9a-f]{3}|[0-9a-f]{6})|rgb\(((?:-?\d+%?,){2}-?\d+%?)\)|(\w+)|hsl\((-?\d+\.?\d*(?:,-?\d+\.?\d*%){2})\))$/i;
-var match=value.match(simple);
-if(match){
-if(match[1]){
-var hex=match[1].toLowerCase();
-var format;
-if(hex.length===3){
-format=WebInspector.Color.Format.ShortHEX;
-hex=hex.charAt(0)+hex.charAt(0)+hex.charAt(1)+hex.charAt(1)+hex.charAt(2)+hex.charAt(2);
-}else
-format=WebInspector.Color.Format.HEX;
-var r=parseInt(hex.substring(0,2),16);
-var g=parseInt(hex.substring(2,4),16);
-var b=parseInt(hex.substring(4,6),16);
-return new WebInspector.Color([r/255,g/255,b/255,1],format,text);
-}
-
-if(match[2]){
-var rgbString=match[2].split(/\s*,\s*/);
-var rgba=[WebInspector.Color._parseRgbNumeric(rgbString[0]),
-WebInspector.Color._parseRgbNumeric(rgbString[1]),
-WebInspector.Color._parseRgbNumeric(rgbString[2]),1];
-return new WebInspector.Color(rgba,WebInspector.Color.Format.RGB,text);
-}
-
-if(match[3]){
-var nickname=match[3].toLowerCase();
-if(nickname in WebInspector.Color.Nicknames){
-var rgba=WebInspector.Color.Nicknames[nickname];
-var color=WebInspector.Color.fromRGBA(rgba);
-color._format=WebInspector.Color.Format.Nickname;
-color._originalText=text;
-return color;
-}
-return null;
-}
-
-if(match[4]){
-var hslString=match[4].replace(/%/g,"").split(/\s*,\s*/);
-var hsla=[WebInspector.Color._parseHueNumeric(hslString[0]),
-WebInspector.Color._parseSatLightNumeric(hslString[1]),
-WebInspector.Color._parseSatLightNumeric(hslString[2]),1];
-var rgba=[];
-WebInspector.Color.hsl2rgb(hsla,rgba);
-return new WebInspector.Color(rgba,WebInspector.Color.Format.HSL,text);
-}
-
-return null;
-}
-
-
-var advanced=/^(?:rgba\(((?:-?\d+%?,){3}-?(?:\d+|\d*\.\d+))\)|hsla\((-?(?:\d+|\d*\.\d+)(?:,-?(?:\d+|\d*\.\d+)*%){2},-?(?:\d+|\d*\.\d+))\))$/;
-match=value.match(advanced);
-if(match){
-if(match[1]){
-var rgbaString=match[1].split(/\s*,\s*/);
-var rgba=[WebInspector.Color._parseRgbNumeric(rgbaString[0]),
-WebInspector.Color._parseRgbNumeric(rgbaString[1]),
-WebInspector.Color._parseRgbNumeric(rgbaString[2]),
-WebInspector.Color._parseAlphaNumeric(rgbaString[3])];
-return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA,text);
-}
-
-if(match[2]){
-var hslaString=match[2].replace(/%/g,"").split(/\s*,\s*/);
-var hsla=[WebInspector.Color._parseHueNumeric(hslaString[0]),
-WebInspector.Color._parseSatLightNumeric(hslaString[1]),
-WebInspector.Color._parseSatLightNumeric(hslaString[2]),
-WebInspector.Color._parseAlphaNumeric(hslaString[3])];
-var rgba=[];
-WebInspector.Color.hsl2rgb(hsla,rgba);
-return new WebInspector.Color(rgba,WebInspector.Color.Format.HSLA,text);
+this._styleToDOMCascade=new Map();
+for(const domCascade of Array.from(this._pseudoDOMCascades.values()).concat(this._mainDOMCascade)){
+for(const style of domCascade.styles())
+this._styleToDOMCascade.set(style,domCascade);
 }
 }
 
-return null;
-};
 
 
 
 
 
-WebInspector.Color.fromRGBA=function(rgba)
-{
-return new WebInspector.Color([rgba[0]/255,rgba[1]/255,rgba[2]/255,rgba[3]],WebInspector.Color.Format.RGBA);
-};
+
+
+_buildMainCascade(inlinePayload,attributesPayload,matchedPayload,inheritedPayload){
+
+const nodeCascades=[];
+
+
+const nodeStyles=[];
+
+
+
+
+function addAttributesStyle(){
+if(!attributesPayload)
+return;
+const style=
+new SDK.CSSStyleDeclaration(this._cssModel,null,attributesPayload,SDK.CSSStyleDeclaration.Type.Attributes);
+this._nodeForStyle.set(style,this._node);
+nodeStyles.push(style);
+}
+
+
+if(inlinePayload&&this._node.nodeType()===Node.ELEMENT_NODE){
+const style=
+new SDK.CSSStyleDeclaration(this._cssModel,null,inlinePayload,SDK.CSSStyleDeclaration.Type.Inline);
+this._nodeForStyle.set(style,this._node);
+nodeStyles.push(style);
+}
+
+
+let addedAttributesStyle;
+for(let i=matchedPayload.length-1;i>=0;--i){
+const rule=new SDK.CSSStyleRule(this._cssModel,matchedPayload[i].rule);
+if((rule.isInjected()||rule.isUserAgent())&&!addedAttributesStyle){
+
+addedAttributesStyle=true;
+addAttributesStyle.call(this);
+}
+this._nodeForStyle.set(rule.style,this._node);
+nodeStyles.push(rule.style);
+this._addMatchingSelectors(this._node,rule,matchedPayload[i].matchingSelectors);
+}
+
+if(!addedAttributesStyle)
+addAttributesStyle.call(this);
+nodeCascades.push(new SDK.CSSMatchedStyles.NodeCascade(this,nodeStyles,false));
+
+
+let parentNode=this._node.parentNode;
+for(let i=0;parentNode&&inheritedPayload&&i<inheritedPayload.length;++i){
+const inheritedStyles=[];
+const entryPayload=inheritedPayload[i];
+const inheritedInlineStyle=entryPayload.inlineStyle?
+new SDK.CSSStyleDeclaration(
+this._cssModel,null,entryPayload.inlineStyle,SDK.CSSStyleDeclaration.Type.Inline):
+null;
+if(inheritedInlineStyle&&this._containsInherited(inheritedInlineStyle)){
+this._nodeForStyle.set(inheritedInlineStyle,parentNode);
+inheritedStyles.push(inheritedInlineStyle);
+this._inheritedStyles.add(inheritedInlineStyle);
+}
+
+const inheritedMatchedCSSRules=entryPayload.matchedCSSRules||[];
+for(let j=inheritedMatchedCSSRules.length-1;j>=0;--j){
+const inheritedRule=new SDK.CSSStyleRule(this._cssModel,inheritedMatchedCSSRules[j].rule);
+this._addMatchingSelectors(parentNode,inheritedRule,inheritedMatchedCSSRules[j].matchingSelectors);
+if(!this._containsInherited(inheritedRule.style))
+continue;
+this._nodeForStyle.set(inheritedRule.style,parentNode);
+inheritedStyles.push(inheritedRule.style);
+this._inheritedStyles.add(inheritedRule.style);
+}
+parentNode=parentNode.parentNode;
+nodeCascades.push(new SDK.CSSMatchedStyles.NodeCascade(this,inheritedStyles,true));
+}
+
+return new SDK.CSSMatchedStyles.DOMInheritanceCascade(nodeCascades);
+}
 
 
 
 
 
-WebInspector.Color.fromHSVA=function(hsva)
-{
-var rgba=[];
-WebInspector.Color.hsva2rgba(hsva,rgba);
-return new WebInspector.Color(rgba,WebInspector.Color.Format.HSLA);
-};
+_buildPseudoCascades(pseudoPayload){
 
-WebInspector.Color.prototype={
+const pseudoCascades=new Map();
+if(!pseudoPayload)
+return pseudoCascades;
+for(let i=0;i<pseudoPayload.length;++i){
+const entryPayload=pseudoPayload[i];
 
-
-
-format:function()
-{
-return this._format;
-},
+const pseudoElement=this._node.pseudoElements().get(entryPayload.pseudoType)||null;
+const pseudoStyles=[];
+const rules=entryPayload.matches||[];
+for(let j=rules.length-1;j>=0;--j){
+const pseudoRule=new SDK.CSSStyleRule(this._cssModel,rules[j].rule);
+pseudoStyles.push(pseudoRule.style);
+this._nodeForStyle.set(pseudoRule.style,pseudoElement);
+if(pseudoElement)
+this._addMatchingSelectors(pseudoElement,pseudoRule,rules[j].matchingSelectors);
+}
+const nodeCascade=new SDK.CSSMatchedStyles.NodeCascade(this,pseudoStyles,false);
+pseudoCascades.set(entryPayload.pseudoType,new SDK.CSSMatchedStyles.DOMInheritanceCascade([nodeCascade]));
+}
+return pseudoCascades;
+}
 
 
 
 
-hsla:function()
-{
-if(this._hsla)
-return this._hsla;
-var r=this._rgba[0];
-var g=this._rgba[1];
-var b=this._rgba[2];
-var max=Math.max(r,g,b);
-var min=Math.min(r,g,b);
-var diff=max-min;
-var add=max+min;
 
-if(min===max)
-var h=0;else
-if(r===max)
-var h=(1/6*(g-b)/diff+1)%1;else
-if(g===max)
-var h=1/6*(b-r)/diff+1/3;else
 
-var h=1/6*(r-g)/diff+2/3;
 
-var l=0.5*add;
-
-if(l===0)
-var s=0;else
-if(l===1)
-var s=0;else
-if(l<=0.5)
-var s=diff/add;else
-
-var s=diff/(2-add);
-
-this._hsla=[h,s,l,this._rgba[3]];
-return this._hsla;
-},
+_addMatchingSelectors(node,rule,matchingSelectorIndices){
+for(const matchingSelectorIndex of matchingSelectorIndices){
+const selector=rule.selectors[matchingSelectorIndex];
+this._setSelectorMatches(node,selector.text,true);
+}
+}
 
 
 
 
-canonicalHSLA:function()
-{
-var hsla=this.hsla();
-return[Math.round(hsla[0]*360),Math.round(hsla[1]*100),Math.round(hsla[2]*100),hsla[3]];
-},
+node(){
+return this._node;
+}
 
 
 
 
-hsva:function()
-{
-var hsla=this.hsla();
-var h=hsla[0];
-var s=hsla[1];
-var l=hsla[2];
-
-s*=l<0.5?l:1-l;
-return[h,s!==0?2*s/(l+s):0,l+s,hsla[3]];
-},
+cssModel(){
+return this._cssModel;
+}
 
 
 
 
-hasAlpha:function()
-{
-return this._rgba[3]!==1;
-},
+
+hasMatchingSelectors(rule){
+const matchingSelectors=this.matchingSelectors(rule);
+return matchingSelectors.length>0&&this.mediaMatches(rule.style);
+}
 
 
 
 
-canBeShortHex:function()
-{
-if(this.hasAlpha())
-return false;
-for(var i=0;i<3;++i){
-var c=Math.round(this._rgba[i]*255);
-if(c%17)
+
+matchingSelectors(rule){
+const node=this.nodeForStyle(rule.style);
+if(!node)
+return[];
+const map=this._matchingSelectors.get(node.id);
+if(!map)
+return[];
+const result=[];
+for(let i=0;i<rule.selectors.length;++i){
+if(map.get(rule.selectors[i].text))
+result.push(i);
+}
+return result;
+}
+
+
+
+
+
+recomputeMatchingSelectors(rule){
+const node=this.nodeForStyle(rule.style);
+if(!node)
+return Promise.resolve();
+const promises=[];
+for(const selector of rule.selectors)
+promises.push(querySelector.call(this,node,selector.text));
+return Promise.all(promises);
+
+
+
+
+
+
+async function querySelector(node,selectorText){
+const ownerDocument=node.ownerDocument||null;
+
+
+const map=this._matchingSelectors.get(node.id);
+if(map&&map.has(selectorText)||!ownerDocument)
+return;
+
+const matchingNodeIds=await this._node.domModel().querySelectorAll(ownerDocument.id,selectorText);
+
+if(matchingNodeIds)
+this._setSelectorMatches(node,selectorText,matchingNodeIds.indexOf(node.id)!==-1);
+}
+}
+
+
+
+
+
+
+addNewRule(rule,node){
+this._addedStyles.set(rule.style,node);
+return this.recomputeMatchingSelectors(rule);
+}
+
+
+
+
+
+
+_setSelectorMatches(node,selectorText,value){
+let map=this._matchingSelectors.get(node.id);
+if(!map){
+map=new Map();
+this._matchingSelectors.set(node.id,map);
+}
+map.set(selectorText,value);
+}
+
+
+
+
+
+mediaMatches(style){
+const media=style.parentRule?style.parentRule.media:[];
+for(let i=0;media&&i<media.length;++i){
+if(!media[i].active())
 return false;
 }
 return true;
-},
+}
 
 
 
 
-asString:function(format)
-{
-if(format===this._format&&this._originalTextIsValid)
-return this._originalText;
-
-if(!format)
-format=this._format;
+nodeStyles(){
+return this._mainDOMCascade.styles();
+}
 
 
 
 
-
-function toRgbValue(value)
-{
-return Math.round(value*255);
+keyframes(){
+return this._keyframes;
 }
 
 
 
 
 
-function toHexValue(value)
-{
-var hex=Math.round(value*255).toString(16);
-return hex.length===1?"0"+hex:hex;
+pseudoStyles(pseudoType){
+const domCascade=this._pseudoDOMCascades.get(pseudoType);
+return domCascade?domCascade.styles():[];
+}
+
+
+
+
+pseudoTypes(){
+return new Set(this._pseudoDOMCascades.keys());
 }
 
 
 
 
 
-function toShortHexValue(value)
-{
-return(Math.round(value*255)/17).toString(16);
+_containsInherited(style){
+const properties=style.allProperties();
+for(let i=0;i<properties.length;++i){
+const property=properties[i];
+
+if(property.activeInStyle()&&SDK.cssMetadata().isPropertyInherited(property.name))
+return true;
+}
+return false;
 }
 
-switch(format){
-case WebInspector.Color.Format.Original:
-return this._originalText;
-case WebInspector.Color.Format.RGB:
-if(this.hasAlpha())
-return null;
-return String.sprintf("rgb(%d, %d, %d)",toRgbValue(this._rgba[0]),toRgbValue(this._rgba[1]),toRgbValue(this._rgba[2]));
-case WebInspector.Color.Format.RGBA:
-return String.sprintf("rgba(%d, %d, %d, %f)",toRgbValue(this._rgba[0]),toRgbValue(this._rgba[1]),toRgbValue(this._rgba[2]),this._rgba[3]);
-case WebInspector.Color.Format.HSL:
-if(this.hasAlpha())
-return null;
-var hsl=this.hsla();
-return String.sprintf("hsl(%d, %d%, %d%)",Math.round(hsl[0]*360),Math.round(hsl[1]*100),Math.round(hsl[2]*100));
-case WebInspector.Color.Format.HSLA:
-var hsla=this.hsla();
-return String.sprintf("hsla(%d, %d%, %d%, %f)",Math.round(hsla[0]*360),Math.round(hsla[1]*100),Math.round(hsla[2]*100),hsla[3]);
-case WebInspector.Color.Format.HEX:
-if(this.hasAlpha())
-return null;
-return String.sprintf("#%s%s%s",toHexValue(this._rgba[0]),toHexValue(this._rgba[1]),toHexValue(this._rgba[2])).toLowerCase();
-case WebInspector.Color.Format.ShortHEX:
-if(!this.canBeShortHex())
-return null;
-return String.sprintf("#%s%s%s",toShortHexValue(this._rgba[0]),toShortHexValue(this._rgba[1]),toShortHexValue(this._rgba[2])).toLowerCase();
-case WebInspector.Color.Format.Nickname:
-return this.nickname();}
-
-
-return this._originalText;
-},
 
 
 
 
-
-rgba:function()
-{
-return this._rgba.slice();
-},
-
-
-
-
-canonicalRGBA:function()
-{
-var rgba=new Array(4);
-for(var i=0;i<3;++i)
-rgba[i]=Math.round(this._rgba[i]*255);
-rgba[3]=this._rgba[3];
-return rgba;
-},
-
-
-
-
-nickname:function()
-{
-if(!WebInspector.Color._rgbaToNickname){
-WebInspector.Color._rgbaToNickname={};
-for(var nickname in WebInspector.Color.Nicknames){
-var rgba=WebInspector.Color.Nicknames[nickname];
-if(rgba.length!==4)
-rgba=rgba.concat(1);
-WebInspector.Color._rgbaToNickname[rgba]=nickname;
-}
+nodeForStyle(style){
+return this._addedStyles.get(style)||this._nodeForStyle.get(style)||null;
 }
 
-return WebInspector.Color._rgbaToNickname[this.canonicalRGBA()]||null;
-},
 
 
 
 
-toProtocolRGBA:function()
-{
-var rgba=this.canonicalRGBA();
-var result={r:rgba[0],g:rgba[1],b:rgba[2]};
-if(rgba[3]!==1)
-result.a=rgba[3];
-return result;
-},
-
-
-
-
-invert:function()
-{
-var rgba=[];
-rgba[0]=1-this._rgba[0];
-rgba[1]=1-this._rgba[1];
-rgba[2]=1-this._rgba[2];
-rgba[3]=this._rgba[3];
-return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA);
-},
+availableCSSVariables(style){
+const domCascade=this._styleToDOMCascade.get(style)||null;
+return domCascade?domCascade.availableCSSVariables(style):[];
+}
 
 
 
 
 
-setAlpha:function(alpha)
-{
-var rgba=this._rgba.slice();
-rgba[3]=alpha;
-return new WebInspector.Color(rgba,WebInspector.Color.Format.RGBA);
+
+computeCSSVariable(style,variableName){
+const domCascade=this._styleToDOMCascade.get(style)||null;
+return domCascade?domCascade.computeCSSVariable(style,variableName):null;
+}
+
+
+
+
+
+
+computeValue(style,value){
+const domCascade=this._styleToDOMCascade.get(style)||null;
+return domCascade?domCascade.computeValue(style,value):null;
+}
+
+
+
+
+
+isInherited(style){
+return this._inheritedStyles.has(style);
+}
+
+
+
+
+
+propertyState(property){
+const domCascade=this._styleToDOMCascade.get(property.ownerStyle);
+return domCascade?domCascade.propertyState(property):null;
+}
+
+resetActiveProperties(){
+this._mainDOMCascade.reset();
+for(const domCascade of this._pseudoDOMCascades.values())
+domCascade.reset();
 }};
 
 
-
-
-
-
-WebInspector.Color._parseRgbNumeric=function(value)
-{
-var parsed=parseInt(value,10);
-if(value.indexOf("%")!==-1)
-parsed/=100;else
-
-parsed/=255;
-return parsed;
-};
+SDK.CSSMatchedStyles.NodeCascade=class{
 
 
 
 
 
-WebInspector.Color._parseHueNumeric=function(value)
-{
-return isNaN(value)?0:parseFloat(value)/360%1;
-};
+constructor(matchedStyles,styles,isInherited){
+this._matchedStyles=matchedStyles;
+this._styles=styles;
+this._isInherited=isInherited;
 
+this._propertiesState=new Map();
 
-
-
-
-WebInspector.Color._parseSatLightNumeric=function(value)
-{
-return Math.min(1,parseFloat(value)/100);
-};
-
-
-
-
-
-WebInspector.Color._parseAlphaNumeric=function(value)
-{
-return isNaN(value)?0:parseFloat(value);
-};
-
-
-
-
-
-WebInspector.Color._hsva2hsla=function(hsva,out_hsla)
-{
-var h=hsva[0];
-var s=hsva[1];
-var v=hsva[2];
-
-var t=(2-s)*v;
-if(v===0||s===0)
-s=0;else
-
-s*=v/(t<1?t:2-t);
-
-out_hsla[0]=h;
-out_hsla[1]=s;
-out_hsla[2]=t/2;
-out_hsla[3]=hsva[3];
-};
-
-
-
-
-
-WebInspector.Color.hsl2rgb=function(hsl,out_rgb)
-{
-var h=hsl[0];
-var s=hsl[1];
-var l=hsl[2];
-
-function hue2rgb(p,q,h)
-{
-if(h<0)
-h+=1;else
-if(h>1)
-h-=1;
-
-if(h*6<1)
-return p+(q-p)*h*6;else
-if(h*2<1)
-return q;else
-if(h*3<2)
-return p+(q-p)*(2/3-h)*6;else
-
-return p;
+this._activeProperties=new Map();
 }
 
-if(s<0)
-s=0;
+_computeActiveProperties(){
+this._propertiesState.clear();
+this._activeProperties.clear();
 
-if(l<=0.5)
-var q=l*(1+s);else
+for(const style of this._styles){
+const rule=style.parentRule;
 
-var q=l+s-l*s;
+if(rule&&!(rule instanceof SDK.CSSStyleRule))
+continue;
+if(rule&&!this._matchedStyles.hasMatchingSelectors(rule))
+continue;
 
-var p=2*l-q;
+for(const property of style.allProperties()){
 
-var tr=h+1/3;
-var tg=h;
-var tb=h-1/3;
+if(this._isInherited&&!SDK.cssMetadata().isPropertyInherited(property.name))
+continue;
 
-out_rgb[0]=hue2rgb(p,q,tr);
-out_rgb[1]=hue2rgb(p,q,tg);
-out_rgb[2]=hue2rgb(p,q,tb);
-out_rgb[3]=hsl[3];
-};
-
-
-
-
-
-WebInspector.Color.hsva2rgba=function(hsva,out_rgba)
-{
-WebInspector.Color._hsva2hsla(hsva,WebInspector.Color.hsva2rgba._tmpHSLA);
-WebInspector.Color.hsl2rgb(WebInspector.Color.hsva2rgba._tmpHSLA,out_rgba);
-
-for(var i=0;i<WebInspector.Color.hsva2rgba._tmpHSLA.length;i++)
-WebInspector.Color.hsva2rgba._tmpHSLA[i]=0;
-};
-
-
-WebInspector.Color.hsva2rgba._tmpHSLA=[0,0,0,0];
-
-
-
-
-
-
-
-
-WebInspector.Color.luminance=function(rgba)
-{
-var rSRGB=rgba[0];
-var gSRGB=rgba[1];
-var bSRGB=rgba[2];
-
-var r=rSRGB<=0.03928?rSRGB/12.92:Math.pow((rSRGB+0.055)/1.055,2.4);
-var g=gSRGB<=0.03928?gSRGB/12.92:Math.pow((gSRGB+0.055)/1.055,2.4);
-var b=bSRGB<=0.03928?bSRGB/12.92:Math.pow((bSRGB+0.055)/1.055,2.4);
-
-return 0.2126*r+0.7152*g+0.0722*b;
-};
-
-
-
-
-
-
-
-WebInspector.Color.blendColors=function(fgRGBA,bgRGBA,out_blended)
-{
-var alpha=fgRGBA[3];
-
-out_blended[0]=(1-alpha)*bgRGBA[0]+alpha*fgRGBA[0];
-out_blended[1]=(1-alpha)*bgRGBA[1]+alpha*fgRGBA[1];
-out_blended[2]=(1-alpha)*bgRGBA[2]+alpha*fgRGBA[2];
-out_blended[3]=alpha+bgRGBA[3]*(1-alpha);
-};
-
-
-
-
-
-
-
-
-
-WebInspector.Color.calculateContrastRatio=function(fgRGBA,bgRGBA)
-{
-WebInspector.Color.blendColors(fgRGBA,bgRGBA,WebInspector.Color.calculateContrastRatio._blendedFg);
-
-var fgLuminance=WebInspector.Color.luminance(WebInspector.Color.calculateContrastRatio._blendedFg);
-var bgLuminance=WebInspector.Color.luminance(bgRGBA);
-var contrastRatio=(Math.max(fgLuminance,bgLuminance)+0.05)/(
-Math.min(fgLuminance,bgLuminance)+0.05);
-
-for(var i=0;i<WebInspector.Color.calculateContrastRatio._blendedFg.length;i++)
-WebInspector.Color.calculateContrastRatio._blendedFg[i]=0;
-
-return contrastRatio;
-};
-
-WebInspector.Color.calculateContrastRatio._blendedFg=[0,0,0,0];
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.Color.desiredLuminance=function(luminance,contrast,lighter)
-{
-function computeLuminance()
-{
-if(lighter)
-return(luminance+0.05)*contrast-0.05;else
-
-return(luminance+0.05)/contrast-0.05;
+if(!property.activeInStyle()){
+this._propertiesState.set(property,SDK.CSSMatchedStyles.PropertyState.Overloaded);
+continue;
 }
-var desiredLuminance=computeLuminance();
-if(desiredLuminance<0||desiredLuminance>1){
-lighter=!lighter;
-desiredLuminance=computeLuminance();
+
+const canonicalName=SDK.cssMetadata().canonicalPropertyName(property.name);
+const activeProperty=this._activeProperties.get(canonicalName);
+if(activeProperty&&(activeProperty.important||!property.important)){
+this._propertiesState.set(property,SDK.CSSMatchedStyles.PropertyState.Overloaded);
+continue;
 }
-return desiredLuminance;
-};
+
+if(activeProperty)
+this._propertiesState.set(activeProperty,SDK.CSSMatchedStyles.PropertyState.Overloaded);
+this._propertiesState.set(property,SDK.CSSMatchedStyles.PropertyState.Active);
+this._activeProperties.set(canonicalName,property);
+}
+}
+}};
 
 
-WebInspector.Color.Nicknames={
-"aliceblue":[240,248,255],
-"antiquewhite":[250,235,215],
-"aqua":[0,255,255],
-"aquamarine":[127,255,212],
-"azure":[240,255,255],
-"beige":[245,245,220],
-"bisque":[255,228,196],
-"black":[0,0,0],
-"blanchedalmond":[255,235,205],
-"blue":[0,0,255],
-"blueviolet":[138,43,226],
-"brown":[165,42,42],
-"burlywood":[222,184,135],
-"cadetblue":[95,158,160],
-"chartreuse":[127,255,0],
-"chocolate":[210,105,30],
-"coral":[255,127,80],
-"cornflowerblue":[100,149,237],
-"cornsilk":[255,248,220],
-"crimson":[237,20,61],
-"cyan":[0,255,255],
-"darkblue":[0,0,139],
-"darkcyan":[0,139,139],
-"darkgoldenrod":[184,134,11],
-"darkgray":[169,169,169],
-"darkgrey":[169,169,169],
-"darkgreen":[0,100,0],
-"darkkhaki":[189,183,107],
-"darkmagenta":[139,0,139],
-"darkolivegreen":[85,107,47],
-"darkorange":[255,140,0],
-"darkorchid":[153,50,204],
-"darkred":[139,0,0],
-"darksalmon":[233,150,122],
-"darkseagreen":[143,188,143],
-"darkslateblue":[72,61,139],
-"darkslategray":[47,79,79],
-"darkslategrey":[47,79,79],
-"darkturquoise":[0,206,209],
-"darkviolet":[148,0,211],
-"deeppink":[255,20,147],
-"deepskyblue":[0,191,255],
-"dimgray":[105,105,105],
-"dimgrey":[105,105,105],
-"dodgerblue":[30,144,255],
-"firebrick":[178,34,34],
-"floralwhite":[255,250,240],
-"forestgreen":[34,139,34],
-"fuchsia":[255,0,255],
-"gainsboro":[220,220,220],
-"ghostwhite":[248,248,255],
-"gold":[255,215,0],
-"goldenrod":[218,165,32],
-"gray":[128,128,128],
-"grey":[128,128,128],
-"green":[0,128,0],
-"greenyellow":[173,255,47],
-"honeydew":[240,255,240],
-"hotpink":[255,105,180],
-"indianred":[205,92,92],
-"indigo":[75,0,130],
-"ivory":[255,255,240],
-"khaki":[240,230,140],
-"lavender":[230,230,250],
-"lavenderblush":[255,240,245],
-"lawngreen":[124,252,0],
-"lemonchiffon":[255,250,205],
-"lightblue":[173,216,230],
-"lightcoral":[240,128,128],
-"lightcyan":[224,255,255],
-"lightgoldenrodyellow":[250,250,210],
-"lightgreen":[144,238,144],
-"lightgray":[211,211,211],
-"lightgrey":[211,211,211],
-"lightpink":[255,182,193],
-"lightsalmon":[255,160,122],
-"lightseagreen":[32,178,170],
-"lightskyblue":[135,206,250],
-"lightslategray":[119,136,153],
-"lightslategrey":[119,136,153],
-"lightsteelblue":[176,196,222],
-"lightyellow":[255,255,224],
-"lime":[0,255,0],
-"limegreen":[50,205,50],
-"linen":[250,240,230],
-"magenta":[255,0,255],
-"maroon":[128,0,0],
-"mediumaquamarine":[102,205,170],
-"mediumblue":[0,0,205],
-"mediumorchid":[186,85,211],
-"mediumpurple":[147,112,219],
-"mediumseagreen":[60,179,113],
-"mediumslateblue":[123,104,238],
-"mediumspringgreen":[0,250,154],
-"mediumturquoise":[72,209,204],
-"mediumvioletred":[199,21,133],
-"midnightblue":[25,25,112],
-"mintcream":[245,255,250],
-"mistyrose":[255,228,225],
-"moccasin":[255,228,181],
-"navajowhite":[255,222,173],
-"navy":[0,0,128],
-"oldlace":[253,245,230],
-"olive":[128,128,0],
-"olivedrab":[107,142,35],
-"orange":[255,165,0],
-"orangered":[255,69,0],
-"orchid":[218,112,214],
-"palegoldenrod":[238,232,170],
-"palegreen":[152,251,152],
-"paleturquoise":[175,238,238],
-"palevioletred":[219,112,147],
-"papayawhip":[255,239,213],
-"peachpuff":[255,218,185],
-"peru":[205,133,63],
-"pink":[255,192,203],
-"plum":[221,160,221],
-"powderblue":[176,224,230],
-"purple":[128,0,128],
-"rebeccapurple":[102,51,153],
-"red":[255,0,0],
-"rosybrown":[188,143,143],
-"royalblue":[65,105,225],
-"saddlebrown":[139,69,19],
-"salmon":[250,128,114],
-"sandybrown":[244,164,96],
-"seagreen":[46,139,87],
-"seashell":[255,245,238],
-"sienna":[160,82,45],
-"silver":[192,192,192],
-"skyblue":[135,206,235],
-"slateblue":[106,90,205],
-"slategray":[112,128,144],
-"slategrey":[112,128,144],
-"snow":[255,250,250],
-"springgreen":[0,255,127],
-"steelblue":[70,130,180],
-"tan":[210,180,140],
-"teal":[0,128,128],
-"thistle":[216,191,216],
-"tomato":[255,99,71],
-"turquoise":[64,224,208],
-"violet":[238,130,238],
-"wheat":[245,222,179],
-"white":[255,255,255],
-"whitesmoke":[245,245,245],
-"yellow":[255,255,0],
-"yellowgreen":[154,205,50],
-"transparent":[0,0,0,0]};
+SDK.CSSMatchedStyles.DOMInheritanceCascade=class{
 
 
-WebInspector.Color.PageHighlight={
-Content:WebInspector.Color.fromRGBA([111,168,220,.66]),
-ContentLight:WebInspector.Color.fromRGBA([111,168,220,.5]),
-ContentOutline:WebInspector.Color.fromRGBA([9,83,148]),
-Padding:WebInspector.Color.fromRGBA([147,196,125,.55]),
-PaddingLight:WebInspector.Color.fromRGBA([147,196,125,.4]),
-Border:WebInspector.Color.fromRGBA([255,229,153,.66]),
-BorderLight:WebInspector.Color.fromRGBA([255,229,153,.5]),
-Margin:WebInspector.Color.fromRGBA([246,178,107,.66]),
-MarginLight:WebInspector.Color.fromRGBA([246,178,107,.5]),
-EventTarget:WebInspector.Color.fromRGBA([255,196,196,.66]),
-Shape:WebInspector.Color.fromRGBA([96,82,177,0.8]),
-ShapeMargin:WebInspector.Color.fromRGBA([96,82,127,.6])};
+
+constructor(nodeCascades){
+this._nodeCascades=nodeCascades;
+
+this._propertiesState=new Map();
+
+this._availableCSSVariables=new Map();
+
+this._computedCSSVariables=new Map();
+this._initialized=false;
+
+
+this._styleToNodeCascade=new Map();
+for(const nodeCascade of nodeCascades){
+for(const style of nodeCascade._styles)
+this._styleToNodeCascade.set(style,nodeCascade);
+}
+}
+
+
+
+
+
+availableCSSVariables(style){
+const nodeCascade=this._styleToNodeCascade.get(style);
+if(!nodeCascade)
+return[];
+this._ensureInitialized();
+return Array.from(this._availableCSSVariables.get(nodeCascade).keys());
+}
 
 
 
 
 
 
-WebInspector.Color.detectColorFormat=function(color)
-{
-const cf=WebInspector.Color.Format;
-var format;
-var formatSetting=WebInspector.moduleSetting("colorFormat").get();
-if(formatSetting===cf.Original)
-format=cf.Original;else
-if(formatSetting===cf.RGB)
-format=color.hasAlpha()?cf.RGBA:cf.RGB;else
-if(formatSetting===cf.HSL)
-format=color.hasAlpha()?cf.HSLA:cf.HSL;else
-if(!color.hasAlpha())
-format=color.canBeShortHex()?cf.ShortHEX:cf.HEX;else
+computeCSSVariable(style,variableName){
+const nodeCascade=this._styleToNodeCascade.get(style);
+if(!nodeCascade)
+return null;
+this._ensureInitialized();
+const availableCSSVariables=this._availableCSSVariables.get(nodeCascade);
+const computedCSSVariables=this._computedCSSVariables.get(nodeCascade);
+return this._innerComputeCSSVariable(availableCSSVariables,computedCSSVariables,variableName);
+}
 
-format=cf.RGBA;
 
-return format;
-};
 
-},{}],100:[function(require,module,exports){
+
+
+
+computeValue(style,value){
+const nodeCascade=this._styleToNodeCascade.get(style);
+if(!nodeCascade)
+return null;
+this._ensureInitialized();
+const availableCSSVariables=this._availableCSSVariables.get(nodeCascade);
+const computedCSSVariables=this._computedCSSVariables.get(nodeCascade);
+return this._innerComputeValue(availableCSSVariables,computedCSSVariables,value);
+}
 
 
 
@@ -45524,6 +64556,18 @@
 
 
 
+_innerComputeCSSVariable(availableCSSVariables,computedCSSVariables,variableName){
+if(!availableCSSVariables.has(variableName))
+return null;
+if(computedCSSVariables.has(variableName))
+return computedCSSVariables.get(variableName);
+
+computedCSSVariables.set(variableName,null);
+const definedValue=availableCSSVariables.get(variableName);
+const computedValue=this._innerComputeValue(availableCSSVariables,computedCSSVariables,definedValue);
+computedCSSVariables.set(variableName,computedValue);
+return computedValue;
+}
 
 
 
@@ -45531,527 +64575,2193 @@
 
 
 
+_innerComputeValue(availableCSSVariables,computedCSSVariables,value){
+const results=TextUtils.TextUtils.splitStringByRegexes(value,[SDK.CSSMetadata.VariableRegex]);
+const tokens=[];
+for(const result of results){
+if(result.regexIndex===-1){
+tokens.push(result.value);
+continue;
+}
+
+const regexMatch=result.value.match(/^var\((--[a-zA-Z0-9-_]+)[,]?\s*(.*)\)$/);
+if(!regexMatch)
+return null;
+const cssVariable=regexMatch[1];
+const computedValue=this._innerComputeCSSVariable(availableCSSVariables,computedCSSVariables,cssVariable);
+if(computedValue===null&&!regexMatch[2])
+return null;
+if(computedValue===null)
+tokens.push(regexMatch[2]);else
+
+tokens.push(computedValue);
+}
+return tokens.map(token=>token.trim()).join(' ');
+}
+
+
+
+
+styles(){
+return Array.from(this._styleToNodeCascade.keys());
+}
 
 
 
 
 
+propertyState(property){
+this._ensureInitialized();
+return this._propertiesState.get(property)||null;
+}
 
+reset(){
+this._initialized=false;
+this._propertiesState.clear();
+this._availableCSSVariables.clear();
+this._computedCSSVariables.clear();
+}
 
-
-
-
-
-
-
-
-
-WebInspector.Object=function(){
-};
-
-WebInspector.Object.prototype={
-
-
-
-
-
-
-
-addEventListener:function(eventType,listener,thisObject)
-{
-if(!listener)
-console.assert(false);
-
-if(!this._listeners)
-this._listeners=new Map();
-if(!this._listeners.has(eventType))
-this._listeners.set(eventType,[]);
-this._listeners.get(eventType).push({thisObject:thisObject,listener:listener});
-return new WebInspector.EventTarget.EventDescriptor(this,eventType,thisObject,listener);
-},
-
-
-
-
-
-
-
-removeEventListener:function(eventType,listener,thisObject)
-{
-console.assert(listener);
-
-if(!this._listeners||!this._listeners.has(eventType))
+_ensureInitialized(){
+if(this._initialized)
 return;
-var listeners=this._listeners.get(eventType);
-for(var i=0;i<listeners.length;++i){
-if(listeners[i].listener===listener&&listeners[i].thisObject===thisObject)
-listeners.splice(i--,1);
+this._initialized=true;
+
+const activeProperties=new Map();
+for(const nodeCascade of this._nodeCascades){
+nodeCascade._computeActiveProperties();
+for(const entry of nodeCascade._propertiesState.entries()){
+const property=entry[0];
+const state=entry[1];
+if(state===SDK.CSSMatchedStyles.PropertyState.Overloaded){
+this._propertiesState.set(property,SDK.CSSMatchedStyles.PropertyState.Overloaded);
+continue;
+}
+const canonicalName=SDK.cssMetadata().canonicalPropertyName(property.name);
+if(activeProperties.has(canonicalName)){
+this._propertiesState.set(property,SDK.CSSMatchedStyles.PropertyState.Overloaded);
+continue;
+}
+activeProperties.set(canonicalName,property);
+this._propertiesState.set(property,SDK.CSSMatchedStyles.PropertyState.Active);
+}
 }
 
-if(!listeners.length)
-this._listeners.delete(eventType);
-},
-
-
-
-
-removeAllListeners:function()
-{
-delete this._listeners;
-},
-
-
-
-
-
-
-hasEventListeners:function(eventType)
-{
-return this._listeners&&this._listeners.has(eventType);
-},
-
-
-
-
-
-
-
-dispatchEventToListeners:function(eventType,eventData)
-{
-if(!this._listeners||!this._listeners.has(eventType))
-return false;
-
-var event=new WebInspector.Event(this,eventType,eventData);
-var listeners=this._listeners.get(eventType).slice(0);
-for(var i=0;i<listeners.length;++i){
-listeners[i].listener.call(listeners[i].thisObject,event);
-if(event._stoppedPropagation)
+for(const entry of activeProperties.entries()){
+const canonicalName=entry[0];
+const shorthandProperty=entry[1];
+const shorthandStyle=shorthandProperty.ownerStyle;
+const longhands=shorthandStyle.longhandProperties(shorthandProperty.name);
+if(!longhands.length)
+continue;
+let hasActiveLonghands=false;
+for(const longhand of longhands){
+const longhandCanonicalName=SDK.cssMetadata().canonicalPropertyName(longhand.name);
+const longhandActiveProperty=activeProperties.get(longhandCanonicalName);
+if(!longhandActiveProperty)
+continue;
+if(longhandActiveProperty.ownerStyle===shorthandStyle){
+hasActiveLonghands=true;
 break;
 }
-
-return event.defaultPrevented;
-}};
-
-
-
-
-
-
-
-
-WebInspector.Event=function(target,type,data)
-{
-this.target=target;
-this.type=type;
-this.data=data;
-this.defaultPrevented=false;
-this._stoppedPropagation=false;
-};
-
-WebInspector.Event.prototype={
-stopPropagation:function()
-{
-this._stoppedPropagation=true;
-},
-
-preventDefault:function()
-{
-this.defaultPrevented=true;
-},
-
-
-
-
-consume:function(preventDefault)
-{
-this.stopPropagation();
-if(preventDefault)
-this.preventDefault();
-}};
-
-
-
-
-
-WebInspector.EventTarget=function()
-{
-};
-
-
-
-
-WebInspector.EventTarget.removeEventListeners=function(eventList)
-{
-for(var i=0;i<eventList.length;++i){
-var eventInfo=eventList[i];
-eventInfo.eventTarget.removeEventListener(eventInfo.eventType,eventInfo.method,eventInfo.receiver);
 }
-
-eventList.splice(0,eventList.length);
-};
-
-WebInspector.EventTarget.prototype={
-
-
-
-
-
-
-addEventListener:function(eventType,listener,thisObject){},
-
-
-
-
-
-
-removeEventListener:function(eventType,listener,thisObject){},
-
-removeAllListeners:function(){},
-
-
-
-
-
-hasEventListeners:function(eventType){},
-
-
-
-
-
-
-dispatchEventToListeners:function(eventType,eventData){}};
-
-
-
-
-
-
-
-
-
-WebInspector.EventTarget.EventDescriptor=function(eventTarget,eventType,receiver,method)
-{
-this.eventTarget=eventTarget;
-this.eventType=eventType;
-this.receiver=receiver;
-this.method=method;
-};
-
-},{}],101:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.ParsedURL=function(url)
-{
-this.isValid=false;
-this.url=url;
-this.scheme="";
-this.host="";
-this.port="";
-this.path="";
-this.queryParams="";
-this.fragment="";
-this.folderPathComponents="";
-this.lastPathComponent="";
-
-
-
-
-
-
-
-var match=url.match(/^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^\s\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);
-if(match){
-this.isValid=true;
-this.scheme=match[1].toLowerCase();
-this.host=match[2];
-this.port=match[3];
-this.path=match[4]||"/";
-this.fragment=match[5];
-}else{
-if(this.url.startsWith("data:")){
-this.scheme="data";
-return;
-}
-if(this.url==="about:blank"){
-this.scheme="about";
-return;
-}
-this.path=this.url;
-}
-
-
-var path=this.path;
-var indexOfQuery=path.indexOf("?");
-if(indexOfQuery!==-1){
-this.queryParams=path.substring(indexOfQuery+1);
-path=path.substring(0,indexOfQuery);
-}
-
-
-var lastSlashIndex=path.lastIndexOf("/");
-if(lastSlashIndex!==-1){
-this.folderPathComponents=path.substring(0,lastSlashIndex);
-this.lastPathComponent=path.substring(lastSlashIndex+1);
-}else
-this.lastPathComponent=path;
-};
-
-
-
-
-
-WebInspector.ParsedURL.splitURLIntoPathComponents=function(url)
-{
-if(url.startsWith("/"))
-url="file://"+url;
-var parsedURL=new WebInspector.ParsedURL(url);
-var origin;
-var folderPath;
-var name;
-if(parsedURL.isValid){
-origin=parsedURL.scheme+"://"+parsedURL.host;
-if(parsedURL.port)
-origin+=":"+parsedURL.port;
-folderPath=parsedURL.folderPathComponents;
-name=parsedURL.lastPathComponent;
-if(parsedURL.queryParams)
-name+="?"+parsedURL.queryParams;
-}else{
-origin="";
-folderPath="";
-name=url;
-}
-var result=[origin];
-var splittedPath=folderPath.split("/");
-for(var i=1;i<splittedPath.length;++i){
-if(!splittedPath[i])
+if(hasActiveLonghands)
 continue;
-result.push(splittedPath[i]);
+activeProperties.delete(canonicalName);
+this._propertiesState.set(shorthandProperty,SDK.CSSMatchedStyles.PropertyState.Overloaded);
 }
-result.push(name);
+
+
+const accumulatedCSSVariables=new Map();
+for(let i=this._nodeCascades.length-1;i>=0;--i){
+const nodeCascade=this._nodeCascades[i];
+for(const entry of nodeCascade._activeProperties.entries()){
+const propertyName=entry[0];
+const property=entry[1];
+if(propertyName.startsWith('--'))
+accumulatedCSSVariables.set(propertyName,property.value);
+}
+this._availableCSSVariables.set(nodeCascade,new Map(accumulatedCSSVariables));
+this._computedCSSVariables.set(nodeCascade,new Map());
+}
+}};
+
+
+
+SDK.CSSMatchedStyles.PropertyState={
+Active:'Active',
+Overloaded:'Overloaded'};
+
+
+},{}],154:[function(require,module,exports){
+
+
+
+
+
+
+SDK.CSSMediaQuery=class{
+
+
+
+constructor(payload){
+this._active=payload.active;
+this._expressions=[];
+for(let j=0;j<payload.expressions.length;++j)
+this._expressions.push(SDK.CSSMediaQueryExpression.parsePayload(payload.expressions[j]));
+}
+
+
+
+
+
+static parsePayload(payload){
+return new SDK.CSSMediaQuery(payload);
+}
+
+
+
+
+active(){
+return this._active;
+}
+
+
+
+
+expressions(){
+return this._expressions;
+}};
+
+
+
+
+
+
+SDK.CSSMediaQueryExpression=class{
+
+
+
+constructor(payload){
+this._value=payload.value;
+this._unit=payload.unit;
+this._feature=payload.feature;
+this._valueRange=payload.valueRange?TextUtils.TextRange.fromObject(payload.valueRange):null;
+this._computedLength=payload.computedLength||null;
+}
+
+
+
+
+
+static parsePayload(payload){
+return new SDK.CSSMediaQueryExpression(payload);
+}
+
+
+
+
+value(){
+return this._value;
+}
+
+
+
+
+unit(){
+return this._unit;
+}
+
+
+
+
+feature(){
+return this._feature;
+}
+
+
+
+
+valueRange(){
+return this._valueRange;
+}
+
+
+
+
+computedLength(){
+return this._computedLength;
+}};
+
+
+
+
+
+
+SDK.CSSMedia=class{
+
+
+
+
+constructor(cssModel,payload){
+this._cssModel=cssModel;
+this._reinitialize(payload);
+}
+
+
+
+
+
+
+static parsePayload(cssModel,payload){
+return new SDK.CSSMedia(cssModel,payload);
+}
+
+
+
+
+
+
+static parseMediaArrayPayload(cssModel,payload){
+const result=[];
+for(let i=0;i<payload.length;++i)
+result.push(SDK.CSSMedia.parsePayload(cssModel,payload[i]));
 return result;
+}
+
+
+
+
+_reinitialize(payload){
+this.text=payload.text;
+this.source=payload.source;
+this.sourceURL=payload.sourceURL||'';
+this.range=payload.range?TextUtils.TextRange.fromObject(payload.range):null;
+this.styleSheetId=payload.styleSheetId;
+this.mediaList=null;
+if(payload.mediaList){
+this.mediaList=[];
+for(let i=0;i<payload.mediaList.length;++i)
+this.mediaList.push(SDK.CSSMediaQuery.parsePayload(payload.mediaList[i]));
+}
+}
+
+
+
+
+rebase(edit){
+if(this.styleSheetId!==edit.styleSheetId||!this.range)
+return;
+if(edit.oldRange.equal(this.range))
+this._reinitialize(edit.payload);else
+
+this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
+}
+
+
+
+
+
+equal(other){
+if(!this.styleSheetId||!this.range||!other.range)
+return false;
+return this.styleSheetId===other.styleSheetId&&this.range.equal(other.range);
+}
+
+
+
+
+active(){
+if(!this.mediaList)
+return true;
+for(let i=0;i<this.mediaList.length;++i){
+if(this.mediaList[i].active())
+return true;
+}
+return false;
+}
+
+
+
+
+lineNumberInSource(){
+if(!this.range)
+return undefined;
+const header=this.header();
+if(!header)
+return undefined;
+return header.lineNumberInSource(this.range.startLine);
+}
+
+
+
+
+columnNumberInSource(){
+if(!this.range)
+return undefined;
+const header=this.header();
+if(!header)
+return undefined;
+return header.columnNumberInSource(this.range.startLine,this.range.startColumn);
+}
+
+
+
+
+header(){
+return this.styleSheetId?this._cssModel.styleSheetHeaderForId(this.styleSheetId):null;
+}
+
+
+
+
+rawLocation(){
+const header=this.header();
+if(!header||this.lineNumberInSource()===undefined)
+return null;
+const lineNumber=Number(this.lineNumberInSource());
+return new SDK.CSSLocation(header,lineNumber,this.columnNumberInSource());
+}};
+
+
+SDK.CSSMedia.Source={
+LINKED_SHEET:'linkedSheet',
+INLINE_SHEET:'inlineSheet',
+MEDIA_RULE:'mediaRule',
+IMPORT_RULE:'importRule'};
+
+
+},{}],155:[function(require,module,exports){
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SDK.CSSMetadata=class{
+
+
+
+constructor(properties){
+this._values=[];
+
+this._longhands=new Map();
+
+this._shorthands=new Map();
+
+this._inherited=new Set();
+
+this._svgProperties=new Set();
+for(let i=0;i<properties.length;++i){
+const property=properties[i];
+const propertyName=property.name;
+if(!CSS.supports(propertyName,'initial'))
+continue;
+this._values.push(propertyName);
+
+if(property.inherited)
+this._inherited.add(propertyName);
+if(property.svg)
+this._svgProperties.add(propertyName);
+
+const longhands=properties[i].longhands;
+if(longhands){
+this._longhands.set(propertyName,longhands);
+for(let j=0;j<longhands.length;++j){
+const longhandName=longhands[j];
+let shorthands=this._shorthands.get(longhandName);
+if(!shorthands){
+shorthands=[];
+this._shorthands.set(longhandName,shorthands);
+}
+shorthands.push(propertyName);
+}
+}
+}
+this._values.sort();
+this._valuesSet=new Set(this._values);
+}
+
+
+
+
+allProperties(){
+return this._values;
+}
+
+
+
+
+
+isSVGProperty(name){
+name=name.toLowerCase();
+return this._svgProperties.has(name);
+}
+
+
+
+
+
+longhands(shorthand){
+return this._longhands.get(shorthand)||null;
+}
+
+
+
+
+
+shorthands(longhand){
+return this._shorthands.get(longhand)||null;
+}
+
+
+
+
+
+isColorAwareProperty(propertyName){
+return!!SDK.CSSMetadata._colorAwareProperties.has(propertyName.toLowerCase())||
+this.isCustomProperty(propertyName.toLowerCase());
+}
+
+
+
+
+
+isLengthProperty(propertyName){
+propertyName=propertyName.toLowerCase();
+if(propertyName==='line-height')
+return false;
+return SDK.CSSMetadata._distanceProperties.has(propertyName)||propertyName.startsWith('margin')||
+propertyName.startsWith('padding')||propertyName.indexOf('width')!==-1||
+propertyName.indexOf('height')!==-1;
+}
+
+
+
+
+
+isBezierAwareProperty(propertyName){
+propertyName=propertyName.toLowerCase();
+return!!SDK.CSSMetadata._bezierAwareProperties.has(propertyName)||this.isCustomProperty(propertyName);
+}
+
+
+
+
+
+isCustomProperty(propertyName){
+return propertyName.startsWith('--');
+}
+
+
+
+
+
+canonicalPropertyName(name){
+name=name.toLowerCase();
+if(!name||name.length<9||name.charAt(0)!=='-')
+return name;
+const match=name.match(/(?:-webkit-)(.+)/);
+if(!match||!this._valuesSet.has(match[1]))
+return name;
+return match[1];
+}
+
+
+
+
+
+isCSSPropertyName(propertyName){
+propertyName=propertyName.toLowerCase();
+if(propertyName.startsWith('-moz-')||propertyName.startsWith('-o-')||propertyName.startsWith('-webkit-')||
+propertyName.startsWith('-ms-'))
+return true;
+return this._valuesSet.has(propertyName);
+}
+
+
+
+
+
+isPropertyInherited(propertyName){
+propertyName=propertyName.toLowerCase();
+return propertyName.startsWith('--')||this._inherited.has(this.canonicalPropertyName(propertyName))||
+this._inherited.has(propertyName);
+}
+
+
+
+
+
+propertyValues(propertyName){
+const acceptedKeywords=['inherit','initial','unset'];
+propertyName=propertyName.toLowerCase();
+const unprefixedName=propertyName.replace(/^-webkit-/,'');
+const entry=SDK.CSSMetadata._propertyDataMap[propertyName]||SDK.CSSMetadata._propertyDataMap[unprefixedName];
+if(entry&&entry.values)
+acceptedKeywords.pushAll(entry.values);
+const commonKeywords=['auto','none'];
+for(const commonKeyword of commonKeywords){
+if(CSS.supports(propertyName,commonKeyword))
+acceptedKeywords.push(commonKeyword);
+}
+if(this.isColorAwareProperty(propertyName)){
+acceptedKeywords.push('currentColor');
+for(const color in Common.Color.Nicknames)
+acceptedKeywords.push(color);
+}
+return acceptedKeywords.sort();
+}
+
+
+
+
+
+propertyUsageWeight(property){
+return SDK.CSSMetadata.Weight[property]||SDK.CSSMetadata.Weight[this.canonicalPropertyName(property)]||0;
+}};
+
+
+SDK.CSSMetadata.VariableRegex=/(var\(--.*?\))/g;
+SDK.CSSMetadata.URLRegex=/url\(\s*('.+?'|".+?"|[^)]+)\s*\)/g;
+
+
+
+
+SDK.cssMetadata=function(){
+if(!SDK.CSSMetadata._instance)
+SDK.CSSMetadata._instance=new SDK.CSSMetadata(SDK.CSSMetadata._generatedProperties||[]);
+return SDK.CSSMetadata._instance;
 };
 
+SDK.CSSMetadata._distanceProperties=new Set([
+'background-position','border-spacing','bottom','font-size','height','left','letter-spacing','max-height',
+'max-width','min-height','min-width','right','text-indent','top','width','word-spacing','grid-row-gap',
+'grid-column-gap','row-gap']);
+
+
+SDK.CSSMetadata._bezierAwareProperties=new Set([
+'animation','animation-timing-function','transition','transition-timing-function','-webkit-animation',
+'-webkit-animation-timing-function','-webkit-transition','-webkit-transition-timing-function']);
+
+
+SDK.CSSMetadata._colorAwareProperties=new Set([
+'backdrop-filter',
+'background',
+'background-color',
+'background-image',
+'border',
+'border-color',
+'border-image',
+'border-image-source',
+'border-bottom',
+'border-bottom-color',
+'border-left',
+'border-left-color',
+'border-right',
+'border-right-color',
+'border-top',
+'border-top-color',
+'box-shadow',
+'caret-color',
+'color',
+'column-rule',
+'column-rule-color',
+'fill',
+'list-style',
+'list-style-image',
+'outline',
+'outline-color',
+'stroke',
+'text-decoration-color',
+'text-shadow',
+'-webkit-border-after',
+'-webkit-border-after-color',
+'-webkit-border-before',
+'-webkit-border-before-color',
+'-webkit-border-end',
+'-webkit-border-end-color',
+'-webkit-border-start',
+'-webkit-border-start-color',
+'-webkit-box-reflect',
+'-webkit-box-shadow',
+'-webkit-column-rule-color',
+'-webkit-filter',
+'-webkit-mask',
+'-webkit-mask-box-image',
+'-webkit-mask-box-image-source',
+'-webkit-mask-image',
+'-webkit-tap-highlight-color',
+'-webkit-text-decoration-color',
+'-webkit-text-emphasis',
+'-webkit-text-emphasis-color',
+'-webkit-text-fill-color',
+'-webkit-text-stroke',
+'-webkit-text-stroke-color']);
+
+
+SDK.CSSMetadata._propertyDataMap={
+'table-layout':{values:['fixed']},
+'visibility':{values:['hidden','visible','collapse']},
+'background-repeat':{values:['repeat','repeat-x','repeat-y','no-repeat','space','round']},
+'content':{values:['normal','close-quote','no-close-quote','no-open-quote','open-quote']},
+'clear':{values:['left','right','both']},
+'overflow-x':{values:['hidden','visible','overlay','scroll','-webkit-paged-x','-webkit-paged-y']},
+'stroke-linejoin':{values:['round','miter','bevel']},
+'baseline-shift':{values:['baseline','sub','super']},
+'border-bottom-width':{values:['medium','thick','thin']},
+'margin-top-collapse':{values:['collapse','separate','discard']},
+'max-height':{values:['min-content','max-content','-webkit-fill-available','fit-content']},
+'box-orient':{
+values:['horizontal','vertical','inline-axis','block-axis']},
+
+'font-stretch':{
+values:[
+'normal','ultra-condensed','extra-condensed','condensed','semi-condensed','semi-expanded','expanded',
+'extra-expanded','ultra-expanded']},
+
+
+'border-left-width':{values:['medium','thick','thin']},
+'box-shadow':{values:['inset']},
+'-webkit-writing-mode':{values:['horizontal-tb','vertical-rl','vertical-lr']},
+'writing-mode':
+{values:['lr','rl','tb','lr-tb','rl-tb','tb-rl','horizontal-tb','vertical-rl','vertical-lr']},
+'border-collapse':{values:['collapse','separate']},
+'page-break-inside':{values:['avoid']},
+'border-top-width':{values:['medium','thick','thin']},
+'outline-style':{values:['inset','groove','ridge','outset','dotted','dashed','solid','double','hidden']},
+'cursor':{
+values:[
+'copy',
+'crosshair',
+'default',
+'grab',
+'grabbing',
+'pointer',
+'move',
+'vertical-text',
+'cell',
+'context-menu',
+'alias',
+'progress',
+'no-drop',
+'not-allowed',
+'-webkit-zoom-in',
+'-webkit-zoom-out',
+'e-resize',
+'ne-resize',
+'nw-resize',
+'n-resize',
+'se-resize',
+'sw-resize',
+'s-resize',
+'w-resize',
+'ew-resize',
+'ns-resize',
+'nesw-resize',
+'nwse-resize',
+'col-resize',
+'row-resize',
+'text',
+'wait',
+'help',
+'all-scroll',
+'zoom-in',
+'zoom-out',
+'-webkit-grab',
+'-webkit-grabbing']},
+
+
+'border-width':{values:['medium','thick','thin']},
+'border-style':{values:['hidden','inset','groove','ridge','outset','dotted','dashed','solid','double']},
+'size':{values:['a3','a4','a5','b4','b5','landscape','ledger','legal','letter','portrait']},
+'background-size':{values:['contain','cover']},
+'direction':{values:['ltr','rtl']},
+'enable-background':{values:['accumulate','new']},
+'float':{values:['left','right']},
+'overflow-y':{values:['hidden','visible','overlay','scroll','-webkit-paged-x','-webkit-paged-y']},
+'margin-bottom-collapse':{values:['collapse','separate','discard']},
+'box-reflect':{values:['left','right','above','below']},
+'overflow':{values:['hidden','visible','overlay','scroll','-webkit-paged-x','-webkit-paged-y']},
+'overscroll-behavior':{values:['contain']},
+'overscroll-behavior-x':{values:['contain']},
+'overscroll-behavior-y':{values:['contain']},
+'contain':{values:['strict','content','size','layout','style','paint']},
+'text-rendering':{values:['optimizeSpeed','optimizeLegibility','geometricPrecision']},
+'text-align':{
+values:[
+'-webkit-auto','start','end','left','right','center','justify','-webkit-left','-webkit-right',
+'-webkit-center','-webkit-match-parent']},
+
+
+'list-style-position':{values:['outside','inside']},
+'color-interpolation':{values:['sRGB','linearRGB']},
+'background-origin':{values:['border-box','content-box','padding-box']},
+'word-wrap':{values:['normal','break-word']},
+'font-weight':
+{values:['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900']},
+'margin-before-collapse':{values:['collapse','separate','discard']},
+'text-transform':{values:['capitalize','uppercase','lowercase']},
+'border-right-style':
+{values:['hidden','inset','groove','ridge','outset','dotted','dashed','solid','double']},
+'border-left-style':
+{values:['hidden','inset','groove','ridge','outset','dotted','dashed','solid','double']},
+'-webkit-text-emphasis':{values:['circle','filled','open','dot','double-circle','triangle','sesame']},
+'font-style':{values:['italic','oblique','normal']},
+'speak':{values:['normal','spell-out','digits','literal-punctuation','no-punctuation']},
+'color-rendering':{values:['optimizeSpeed','optimizeQuality']},
+'list-style-type':{
+values:[
+'disc',
+'circle',
+'square',
+'decimal',
+'decimal-leading-zero',
+'arabic-indic',
+'bengali',
+'cambodian',
+'khmer',
+'devanagari',
+'gujarati',
+'gurmukhi',
+'kannada',
+'lao',
+'malayalam',
+'mongolian',
+'myanmar',
+'oriya',
+'persian',
+'urdu',
+'telugu',
+'tibetan',
+'thai',
+'lower-roman',
+'upper-roman',
+'lower-greek',
+'lower-alpha',
+'lower-latin',
+'upper-alpha',
+'upper-latin',
+'ethiopic-halehame',
+'ethiopic-halehame-am',
+'ethiopic-halehame-ti-er',
+'ethiopic-halehame-ti-et',
+'cjk-earthly-branch',
+'cjk-heavenly-stem',
+'hangul-consonant',
+'hangul',
+'korean-hangul-formal',
+'korean-hanja-formal',
+'korean-hanja-informal',
+'simp-chinese-formal',
+'simp-chinese-informal',
+'trad-chinese-formal',
+'trad-chinese-informal',
+'hebrew',
+'armenian',
+'lower-armenian',
+'upper-armenian',
+'georgian',
+'cjk-ideographic',
+'hiragana',
+'katakana',
+'hiragana-iroha',
+'katakana-iroha']},
+
+
+'text-combine-upright':{values:['all']},
+'-webkit-text-combine':{values:['horizontal']},
+'text-orientation':{values:['mixed','upright','sideways','sideways-right']},
+'outline':{
+values:['inset','groove','ridge','outset','dotted','dashed','solid','double','medium','thick','thin']},
+
+'font':{
+values:[
+'caption',
+'icon',
+'menu',
+'message-box',
+'small-caption',
+'-webkit-mini-control',
+'-webkit-small-control',
+'-webkit-control',
+'status-bar',
+'italic',
+'oblique',
+'small-caps',
+'normal',
+'bold',
+'bolder',
+'lighter',
+'100',
+'200',
+'300',
+'400',
+'500',
+'600',
+'700',
+'800',
+'900',
+'xx-small',
+'x-small',
+'small',
+'medium',
+'large',
+'x-large',
+'xx-large',
+'-webkit-xxx-large',
+'smaller',
+'larger',
+'serif',
+'sans-serif',
+'cursive',
+'fantasy',
+'monospace',
+'-webkit-body',
+'-webkit-pictograph']},
+
+
+'dominant-baseline':{
+values:[
+'middle','central','text-before-edge','text-after-edge','ideographic','alphabetic','hanging',
+'mathematical','use-script','no-change','reset-size']},
+
+
+'display':{
+values:[
+'inline',
+'block',
+'flow-root',
+'list-item',
+'inline-block',
+'table',
+'inline-table',
+'table-row-group',
+'table-header-group',
+'table-footer-group',
+'table-row',
+'table-column-group',
+'table-column',
+'table-cell',
+'table-caption',
+'-webkit-box',
+'-webkit-inline-box',
+'flex',
+'inline-flex',
+'grid',
+'inline-grid',
+'contents']},
+
+
+'-webkit-text-emphasis-position':{values:['over','under']},
+'image-rendering':{values:['pixelated','-webkit-optimize-contrast','optimizeSpeed','optimizeQuality']},
+'alignment-baseline':{
+values:[
+'baseline','middle','before-edge','after-edge','central','text-before-edge','text-after-edge',
+'ideographic','alphabetic','hanging','mathematical']},
+
+
+'outline-width':{values:['medium','thick','thin']},
+'box-align':{values:['baseline','center','stretch','start','end']},
+'border-right-width':{values:['medium','thick','thin']},
+'border-top-style':{values:['hidden','inset','groove','ridge','outset','dotted','dashed','solid','double']},
+'line-height':{values:['normal']},
+'text-overflow':{values:['clip','ellipsis']},
+'overflow-wrap':{values:['normal','break-word']},
+'box-direction':{values:['normal','reverse']},
+'margin-after-collapse':{values:['collapse','separate','discard']},
+'page-break-before':{values:['left','right','always','avoid']},
+'border-image':{values:['repeat','stretch','space','round']},
+'text-decoration':
+{values:['blink','line-through','overline','underline','wavy','double','solid','dashed','dotted']},
+'position':{values:['absolute','fixed','relative','static','sticky']},
+'font-family':
+{values:['serif','sans-serif','cursive','fantasy','monospace','-webkit-body','-webkit-pictograph']},
+'border-bottom-style':
+{values:['hidden','inset','groove','ridge','outset','dotted','dashed','solid','double']},
+'unicode-bidi':{values:['normal','bidi-override','embed','isolate','isolate-override','plaintext']},
+'clip-rule':{values:['nonzero','evenodd']},
+'zoom':{values:['normal']},
+'max-width':{values:['min-content','max-content','-webkit-fill-available','fit-content']},
+'caption-side':{values:['top','bottom']},
+'empty-cells':{values:['hide','show']},
+'pointer-events':{
+values:[
+'all','visible','visiblepainted','visiblefill','visiblestroke','painted','fill','stroke','bounding-box']},
+
+
+'letter-spacing':{values:['normal']},
+'background-clip':{values:['border-box','content-box','padding-box']},
+'-webkit-font-smoothing':{values:['antialiased','subpixel-antialiased']},
+'border':{
+values:[
+'hidden','inset','groove','ridge','outset','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'font-size':{
+values:[
+'xx-small','x-small','small','medium','large','x-large','xx-large','-webkit-xxx-large','smaller','larger']},
+
+
+'font-variant':{
+values:[
+'small-caps',
+'normal',
+'common-ligatures',
+'no-common-ligatures',
+'discretionary-ligatures',
+'no-discretionary-ligatures',
+'historical-ligatures',
+'no-historical-ligatures',
+'contextual',
+'no-contextual',
+'all-small-caps',
+'petite-caps',
+'all-petite-caps',
+'unicase',
+'titling-caps',
+'lining-nums',
+'oldstyle-nums',
+'proportional-nums',
+'tabular-nums',
+'diagonal-fractions',
+'stacked-fractions',
+'ordinal',
+'slashed-zero',
+'jis78',
+'jis83',
+'jis90',
+'jis04',
+'simplified',
+'traditional',
+'full-width',
+'proportional-width',
+'ruby']},
+
+
+'vertical-align':{
+values:
+['baseline','middle','sub','super','text-top','text-bottom','top','bottom','-webkit-baseline-middle']},
+
+'white-space':{values:['normal','nowrap','pre','pre-line','pre-wrap']},
+'page-break-after':{values:['left','right','always','avoid']},
+'word-break':{values:['normal','break-all','break-word','keep-all']},
+'word-spacing':{values:['normal']},
+'-webkit-text-emphasis-style':{values:['circle','filled','open','dot','double-circle','triangle','sesame']},
+'transform':{
+values:[
+'scale','scaleX','scaleY','scale3d','rotate','rotateX','rotateY',
+'rotateZ','rotate3d','skew','skewX','skewY','translate','translateX',
+'translateY','translateZ','translate3d','matrix','matrix3d','perspective']},
+
+
+'box-sizing':{values:['content-box','border-box']},
+'resize':{values:['both','horizontal','vertical']},
+'align-content':{
+values:[
+'normal','baseline','space-between','space-around','space-evenly','stretch','unsafe','safe','center',
+'start','end','flex-start','flex-end','left','right']},
+
+
+'justify-content':{
+values:[
+'normal','space-between','space-around','space-evenly','stretch','unsafe','safe','center','start','end',
+'flex-start','flex-end','left','right','baseline']},
+
+
+'place-content':{
+values:[
+'normal','space-between','space-around','space-evenly','stretch','unsafe','safe','center','start','end',
+'flex-start','flex-end','left','right','baseline']},
+
+
+'align-items':{
+values:[
+'normal','stretch','baseline','unsafe','safe','center','start','end','self-start','self-end',
+'flex-start','flex-end','left','right']},
+
+
+'justify-items':{
+values:[
+'normal','stretch','baseline','unsafe','safe','center','start','end','self-start','self-end',
+'flex-start','flex-end','left','right','legacy']},
+
+
+'place-items':{
+values:[
+'normal','stretch','baseline','unsafe','safe','center','start','end','self-start','self-end',
+'flex-start','flex-end','left','right']},
+
+
+'align-self':{
+values:[
+'normal','stretch','baseline','unsafe','safe','center','start','end','self-start','self-end',
+'flex-start','flex-end','left','right']},
+
+
+'justify-self':{
+values:[
+'normal','stretch','baseline','unsafe','safe','center','start','end','self-start','self-end',
+'flex-start','flex-end','left','right']},
+
+
+'place-self':{
+values:[
+'normal','stretch','baseline','unsafe','safe','center','start','end','self-start','self-end',
+'flex-start','flex-end','left','right']},
+
+
+'flex-direction':{values:['row','row-reverse','column','column-reverse']},
+'flex-wrap':{values:['nowrap','wrap','wrap-reverse']},
+'perspective-origin':{values:['left','center','right','top','bottom']},
+'transform-origin':{values:['left','center','right','top','bottom']},
+'transform-style':{values:['flat','preserve-3d']},
+'transition-timing-function':{
+values:[
+'ease','linear','ease-in','ease-out','ease-in-out','step-start','step-end','steps','frames',
+'cubic-bezier','step-middle']},
+
+
+'animation-timing-function':{
+values:[
+'ease','linear','ease-in','ease-out','ease-in-out','step-start','step-end','steps','frames',
+'cubic-bezier','step-middle']},
+
+
+'animation-direction':{values:['normal','reverse','alternate','alternate-reverse']},
+'animation-play-state':{values:['running','paused']},
+'animation-fill-mode':{values:['forwards','backwards','both']},
+'-webkit-backface-visibility':{values:['visible','hidden']},
+'-webkit-box-decoration-break':{values:['slice','clone']},
+'-webkit-column-break-after':
+{values:['always','avoid','left','right','page','column','avoid-page','avoid-column']},
+'-webkit-column-break-before':
+{values:['always','avoid','left','right','page','column','avoid-page','avoid-column']},
+'-webkit-column-break-inside':{values:['avoid','avoid-page','avoid-column']},
+'-webkit-column-span':{values:['all']},
+'-webkit-column-gap':{values:['normal']},
+'filter':{
+values:[
+'url','blur','brightness','contrast','drop-shadow','grayscale','hue-rotate','invert','opacity',
+'saturate','sepia']},
+
+
+'line-break':{values:['loose','normal','strict','after-white-space']},
+'user-select':{values:['text','all']},
+'-webkit-user-modify':{values:['read-only','read-write','read-write-plaintext-only']},
+'text-align-last':{values:['start','end','left','right','center','justify']},
+'-webkit-text-decoration-line':{values:['underline','overline','line-through','blink']},
+'-webkit-text-decoration-style':{values:['solid','double','dotted','dashed','wavy']},
+'mix-blend-mode':{
+values:[
+'normal','multiply','screen','overlay','darken','lighten','color-dodge','color-burn','hard-light',
+'soft-light','difference','exclusion','hue','saturation','color','luminosity','unset']},
+
+
+'background-blend-mode':{
+values:[
+'normal','multiply','screen','overlay','darken','lighten','color-dodge','color-burn','hard-light',
+'soft-light','difference','exclusion','hue','saturation','color','luminosity','unset']},
+
+
+'grid-template-columns':{values:['min-content','max-content']},
+'grid-template-rows':{values:['min-content','max-content']},
+'grid-auto-columns':{values:['min-content','max-content']},
+'grid-auto-rows':{values:['min-content','max-content']},
+'grid-auto-flow':{values:['row','column','dense']},
+'row-gap':{values:['normal']},
+'animation-iteration-count':{values:['infinite']},
+'font-feature-settings':{values:['normal']},
+'font-kerning':{values:['normal']},
+'font-variant-caps':
+{values:['small-caps','all-small-caps','petite-caps','all-petite-caps','unicase','titling-caps','normal']},
+'font-variant-east-asian':{
+values:[
+'jis78','jis83','jis90','jis04','simplified','traditional','full-width','proportional-width','ruby',
+'normal']},
+
+
+'font-variant-ligatures':{
+values:[
+'common-ligatures','no-common-ligatures','discretionary-ligatures','no-discretionary-ligatures',
+'historical-ligatures','no-historical-ligatures','contextual','no-contextual','normal']},
+
+
+'font-variant-numeric':{
+values:[
+'lining-nums','oldstyle-nums','proportional-nums','tabular-nums','diagonal-fractions','stacked-fractions',
+'ordinal','slashed-zero','normal']},
+
+
+'font-variation-settings':{values:['normal']},
+'backface-visibility':{values:['hidden','visible']},
+'background':{
+values:[
+'repeat','repeat-x','repeat-y','no-repeat','top','bottom','left','right','center','fixed','local',
+'scroll','space','round','border-box','content-box','padding-box']},
+
+
+'background-attachment':{values:['fixed','local','scroll']},
+'background-position':{values:['top','bottom','left','right','center']},
+'background-position-x':{values:['left','right','center']},
+'background-position-y':{values:['top','bottom','center']},
+'background-repeat-x':{values:['repeat','no-repeat']},
+'background-repeat-y':{values:['repeat','no-repeat']},
+'border-bottom':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'border-image-repeat':{values:['repeat','stretch','space','round']},
+'border-left':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'border-right':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'border-top':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'break-after':{values:['left','right','avoid','column','avoid-page','page','recto','verso','avoid-column']},
+'break-before':
+{values:['left','right','avoid','column','avoid-page','page','recto','verso','avoid-column']},
+'break-inside':{values:['avoid','avoid-page','avoid-column']},
+'buffered-rendering':{values:['static','dynamic']},
+'color-interpolation-filters':{values:['srgb','linearrgb']},
+'column-fill':{values:['balance']},
+'column-gap':{values:['normal']},
+'column-rule':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'column-rule-style':
+{values:['hidden','inset','groove','outset','ridge','dotted','dashed','solid','double']},
+'column-rule-width':{values:['medium','thick','thin']},
+'column-span':{values:['all']},
+'fill-rule':{values:['nonzero','evenodd']},
+'flex-flow':{values:['nowrap','row','row-reverse','column','column-reverse','wrap','wrap-reverse']},
+'height':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'hyphens':{values:['manual']},
+'inline-size':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'isolation':{values:['isolate']},
+'list-style':{
+values:[
+'outside',
+'inside',
+'disc',
+'circle',
+'square',
+'decimal',
+'decimal-leading-zero',
+'arabic-indic',
+'bengali',
+'cambodian',
+'khmer',
+'devanagari',
+'gujarati',
+'gurmukhi',
+'kannada',
+'lao',
+'malayalam',
+'mongolian',
+'myanmar',
+'oriya',
+'persian',
+'urdu',
+'telugu',
+'tibetan',
+'thai',
+'lower-roman',
+'upper-roman',
+'lower-greek',
+'lower-alpha',
+'lower-latin',
+'upper-alpha',
+'upper-latin',
+'cjk-earthly-branch',
+'cjk-heavenly-stem',
+'ethiopic-halehame',
+'ethiopic-halehame-am',
+'ethiopic-halehame-ti-er',
+'ethiopic-halehame-ti-et',
+'hangul',
+'hangul-consonant',
+'korean-hangul-formal',
+'korean-hanja-formal',
+'korean-hanja-informal',
+'hebrew',
+'armenian',
+'lower-armenian',
+'upper-armenian',
+'georgian',
+'cjk-ideographic',
+'simp-chinese-formal',
+'simp-chinese-informal',
+'trad-chinese-formal',
+'trad-chinese-informal',
+'hiragana',
+'katakana',
+'hiragana-iroha',
+'katakana-iroha']},
+
+
+'mask-source-type':{values:['alpha','luminance']},
+'mask-type':{values:['alpha','luminance']},
+'max-block-size':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'max-inline-size':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'min-block-size':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'min-height':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'min-inline-size':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'min-width':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'object-fit':{values:['contain','cover','fill','scale-down']},
+'object-position':{values:['top','bottom','left','right','center']},
+'offset-anchor':{values:['top','bottom','left','right','center']},
+'offset-position':{values:['top','bottom','left','right','center']},
+'offset-rotate':{values:['reverse']},
+'overflow-anchor':{values:['visible']},
+'paint-order':{values:['normal','fill','stroke','markers']},
+'scroll-behavior':{values:['smooth']},
+'scroll-customization':{
+values:[
+'pan-x',
+'pan-y',
+'pan-left',
+'pan-right',
+'pan-up',
+'pan-down']},
+
+
+'scroll-snap-align':{values:['start','end','center']},
+'scroll-snap-stop':{values:['normal','always']},
+'scroll-snap-type':{values:['x','y','block','inline','both','mandatory','proximity']},
+'shape-outside':{values:['border-box','content-box','padding-box','margin-box']},
+'shape-rendering':{values:['optimizespeed','geometricprecision','crispedges']},
+'stroke-linecap':{values:['square','round','butt']},
+'text-anchor':{values:['middle','start','end']},
+'text-decoration-line':{values:['blink','line-through','overline','underline']},
+'text-decoration-style':{values:['dotted','dashed','solid','double','wavy']},
+'text-justify':{values:['inter-word','distribute']},
+'text-underline-position':{values:['under']},
+'touch-action':
+{values:['pan-x','pan-y','pan-left','pan-right','pan-up','pan-down','manipulation','pinch-zoom']},
+'transform-box':{values:['border-box','fill-box','view-box']},
+'vector-effect':{values:['non-scaling-stroke']},
+'-webkit-app-region':{values:['drag','no-drag']},
+'-webkit-appearance':{
+values:[
+'checkbox',
+'radio',
+'push-button',
+'square-button',
+'button',
+'button-bevel',
+'inner-spin-button',
+'listbox',
+'listitem',
+'media-enter-fullscreen-button',
+'media-exit-fullscreen-button',
+'media-mute-button',
+'media-play-button',
+'media-overlay-play-button',
+'media-toggle-closed-captions-button',
+'media-slider',
+'media-sliderthumb',
+'media-volume-slider-container',
+'media-volume-slider',
+'media-volume-sliderthumb',
+'media-controls-background',
+'media-controls-fullscreen-background',
+'media-current-time-display',
+'media-time-remaining-display',
+'menulist',
+'menulist-button',
+'menulist-text',
+'menulist-textfield',
+'meter',
+'progress-bar',
+'progress-bar-value',
+'slider-horizontal',
+'slider-vertical',
+'sliderthumb-horizontal',
+'sliderthumb-vertical',
+'caret',
+'searchfield',
+'searchfield-cancel-button',
+'textfield',
+'textarea']},
+
+
+'-webkit-border-after':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'-webkit-border-after-style':
+{values:['hidden','inset','groove','outset','ridge','dotted','dashed','solid','double']},
+'-webkit-border-after-width':{values:['medium','thick','thin']},
+'-webkit-border-before':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'-webkit-border-before-style':
+{values:['hidden','inset','groove','outset','ridge','dotted','dashed','solid','double']},
+'-webkit-border-before-width':{values:['medium','thick','thin']},
+'-webkit-border-end':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'-webkit-border-end-style':
+{values:['hidden','inset','groove','outset','ridge','dotted','dashed','solid','double']},
+'-webkit-border-end-width':{values:['medium','thick','thin']},
+'-webkit-border-start':{
+values:[
+'hidden','inset','groove','outset','ridge','dotted','dashed','solid','double','medium','thick','thin']},
+
+
+'-webkit-border-start-style':
+{values:['hidden','inset','groove','outset','ridge','dotted','dashed','solid','double']},
+'-webkit-border-start-width':{values:['medium','thick','thin']},
+'-webkit-box-pack':{values:['center','justify','start','end']},
+'-webkit-logical-height':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'-webkit-logical-width':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'-webkit-margin-collapse':{values:['collapse','separate','discard']},
+'-webkit-mask-box-image':{values:['repeat','stretch','space','round']},
+'-webkit-mask-box-image-repeat':{values:['repeat','stretch','space','round']},
+'-webkit-mask-clip':{values:['text','border','border-box','content','content-box','padding','padding-box']},
+'-webkit-mask-composite':{
+values:[
+'clear','copy','source-over','source-in','source-out','source-atop','destination-over','destination-in',
+'destination-out','destination-atop','xor','plus-lighter']},
+
+
+'-webkit-mask-origin':{values:['border','border-box','content','content-box','padding','padding-box']},
+'-webkit-mask-position':{values:['top','bottom','left','right','center']},
+'-webkit-mask-position-x':{values:['left','right','center']},
+'-webkit-mask-position-y':{values:['top','bottom','center']},
+'-webkit-mask-repeat':{values:['repeat','repeat-x','repeat-y','no-repeat','space','round']},
+'-webkit-mask-size':{values:['contain','cover']},
+'-webkit-max-logical-height':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'-webkit-max-logical-width':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'-webkit-min-logical-height':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'-webkit-min-logical-width':{values:['-webkit-fill-available','min-content','max-content','fit-content']},
+'-webkit-perspective-origin-x':{values:['left','right','center']},
+'-webkit-perspective-origin-y':{values:['top','bottom','center']},
+'-webkit-print-color-adjust':{values:['economy','exact']},
+'-webkit-rtl-ordering':{values:['logical','visual']},
+'-webkit-ruby-position':{values:['after','before']},
+'-webkit-text-decorations-in-effect':{values:['blink','line-through','overline','underline']},
+'-webkit-text-security':{values:['disc','circle','square']},
+'-webkit-text-stroke':{values:['medium','thick','thin']},
+'-webkit-text-stroke-width':{values:['medium','thick','thin']},
+'-webkit-transform-origin-x':{values:['left','right','center']},
+'-webkit-transform-origin-y':{values:['top','bottom','center']},
+'-webkit-user-drag':{values:['element']},
+'width':{values:['-webkit-fill-available','min-content','max-content','fit-content']}};
 
 
 
-
-WebInspector.ParsedURL.extractOrigin=function(url)
-{
-var parsedURL=new WebInspector.ParsedURL(url);
-if(!parsedURL.isValid)
-return"";
-
-var origin=parsedURL.scheme+"://"+parsedURL.host;
-if(parsedURL.port)
-origin+=":"+parsedURL.port;
-return origin;
-};
+SDK.CSSMetadata.Weight={
+'align-content':57,
+'align-items':129,
+'align-self':55,
+'animation':175,
+'animation-delay':114,
+'animation-direction':113,
+'animation-duration':137,
+'animation-fill-mode':132,
+'animation-iteration-count':124,
+'animation-name':139,
+'animation-play-state':104,
+'animation-timing-function':141,
+'backface-visibility':123,
+'background':260,
+'background-attachment':119,
+'background-clip':165,
+'background-color':259,
+'background-image':246,
+'background-origin':107,
+'background-position':237,
+'background-position-x':108,
+'background-position-y':93,
+'background-repeat':234,
+'background-size':203,
+'border':263,
+'border-bottom':233,
+'border-bottom-color':190,
+'border-bottom-left-radius':186,
+'border-bottom-right-radius':185,
+'border-bottom-style':150,
+'border-bottom-width':179,
+'border-collapse':209,
+'border-color':226,
+'border-image':89,
+'border-image-outset':50,
+'border-image-repeat':49,
+'border-image-slice':58,
+'border-image-source':32,
+'border-image-width':52,
+'border-left':221,
+'border-left-color':174,
+'border-left-style':142,
+'border-left-width':172,
+'border-radius':224,
+'border-right':223,
+'border-right-color':182,
+'border-right-style':130,
+'border-right-width':178,
+'border-spacing':198,
+'border-style':206,
+'border-top':231,
+'border-top-color':192,
+'border-top-left-radius':187,
+'border-top-right-radius':189,
+'border-top-style':152,
+'border-top-width':180,
+'border-width':214,
+'bottom':227,
+'box-shadow':213,
+'box-sizing':216,
+'caption-side':96,
+'clear':229,
+'clip':173,
+'clip-rule':5,
+'color':256,
+'content':219,
+'counter-increment':111,
+'counter-reset':110,
+'cursor':250,
+'direction':176,
+'display':262,
+'empty-cells':99,
+'fill':140,
+'fill-opacity':82,
+'fill-rule':22,
+'filter':160,
+'flex':133,
+'flex-basis':66,
+'flex-direction':85,
+'flex-flow':94,
+'flex-grow':112,
+'flex-shrink':61,
+'flex-wrap':68,
+'float':252,
+'font':211,
+'font-family':254,
+'font-kerning':18,
+'font-size':264,
+'font-stretch':77,
+'font-style':220,
+'font-variant':161,
+'font-weight':257,
+'height':266,
+'image-rendering':90,
+'justify-content':127,
+'left':248,
+'letter-spacing':188,
+'line-height':244,
+'list-style':215,
+'list-style-image':145,
+'list-style-position':149,
+'list-style-type':199,
+'margin':267,
+'margin-bottom':241,
+'margin-left':243,
+'margin-right':238,
+'margin-top':253,
+'mask':20,
+'max-height':205,
+'max-width':225,
+'min-height':217,
+'min-width':218,
+'object-fit':33,
+'opacity':251,
+'order':117,
+'orphans':146,
+'outline':222,
+'outline-color':153,
+'outline-offset':147,
+'outline-style':151,
+'outline-width':148,
+'overflow':255,
+'overflow-wrap':105,
+'overflow-x':184,
+'overflow-y':196,
+'padding':265,
+'padding-bottom':230,
+'padding-left':235,
+'padding-right':232,
+'padding-top':240,
+'page':8,
+'page-break-after':120,
+'page-break-before':69,
+'page-break-inside':121,
+'perspective':92,
+'perspective-origin':103,
+'pointer-events':183,
+'position':261,
+'quotes':158,
+'resize':168,
+'right':245,
+'shape-rendering':38,
+'size':64,
+'speak':118,
+'src':170,
+'stop-color':42,
+'stop-opacity':31,
+'stroke':98,
+'stroke-dasharray':36,
+'stroke-dashoffset':3,
+'stroke-linecap':30,
+'stroke-linejoin':21,
+'stroke-miterlimit':12,
+'stroke-opacity':34,
+'stroke-width':87,
+'table-layout':171,
+'tab-size':46,
+'text-align':260,
+'text-anchor':35,
+'text-decoration':247,
+'text-indent':207,
+'text-overflow':204,
+'text-rendering':155,
+'text-shadow':208,
+'text-transform':202,
+'top':258,
+'touch-action':80,
+'transform':181,
+'transform-origin':162,
+'transform-style':86,
+'transition':193,
+'transition-delay':134,
+'transition-duration':135,
+'transition-property':131,
+'transition-timing-function':122,
+'unicode-bidi':156,
+'unicode-range':136,
+'vertical-align':236,
+'visibility':242,
+'-webkit-appearance':191,
+'-webkit-backface-visibility':154,
+'-webkit-background-clip':164,
+'-webkit-background-origin':40,
+'-webkit-background-size':163,
+'-webkit-border-end':9,
+'-webkit-border-horizontal-spacing':81,
+'-webkit-border-image':75,
+'-webkit-border-radius':212,
+'-webkit-border-start':10,
+'-webkit-border-start-color':16,
+'-webkit-border-start-width':13,
+'-webkit-border-vertical-spacing':43,
+'-webkit-box-align':101,
+'-webkit-box-direction':51,
+'-webkit-box-flex':128,
+'-webkit-box-ordinal-group':91,
+'-webkit-box-orient':144,
+'-webkit-box-pack':106,
+'-webkit-box-reflect':39,
+'-webkit-box-shadow':210,
+'-webkit-column-break-inside':60,
+'-webkit-column-count':84,
+'-webkit-column-gap':76,
+'-webkit-column-rule':25,
+'-webkit-column-rule-color':23,
+'-webkit-columns':44,
+'-webkit-column-span':29,
+'-webkit-column-width':47,
+'-webkit-filter':159,
+'-webkit-font-feature-settings':59,
+'-webkit-font-smoothing':177,
+'-webkit-highlight':1,
+'-webkit-line-break':45,
+'-webkit-line-clamp':126,
+'-webkit-margin-after':67,
+'-webkit-margin-before':70,
+'-webkit-margin-collapse':14,
+'-webkit-margin-end':65,
+'-webkit-margin-start':100,
+'-webkit-margin-top-collapse':78,
+'-webkit-mask':19,
+'-webkit-mask-box-image':72,
+'-webkit-mask-image':88,
+'-webkit-mask-position':54,
+'-webkit-mask-repeat':63,
+'-webkit-mask-size':79,
+'-webkit-padding-after':15,
+'-webkit-padding-before':28,
+'-webkit-padding-end':48,
+'-webkit-padding-start':73,
+'-webkit-print-color-adjust':83,
+'-webkit-rtl-ordering':7,
+'-webkit-tap-highlight-color':169,
+'-webkit-text-emphasis-color':11,
+'-webkit-text-fill-color':71,
+'-webkit-text-security':17,
+'-webkit-text-stroke':56,
+'-webkit-text-stroke-color':37,
+'-webkit-text-stroke-width':53,
+'-webkit-user-drag':95,
+'-webkit-user-modify':62,
+'-webkit-user-select':194,
+'-webkit-writing-mode':4,
+'white-space':228,
+'widows':115,
+'width':268,
+'will-change':74,
+'word-break':166,
+'word-spacing':157,
+'word-wrap':197,
+'writing-mode':41,
+'z-index':239,
+'zoom':200};
 
 
-
-
-
-WebInspector.ParsedURL.extractExtension=function(url)
-{
-var lastIndexOfDot=url.lastIndexOf(".");
-var extension=lastIndexOfDot!==-1?url.substr(lastIndexOfDot+1):"";
-var indexOfQuestionMark=extension.indexOf("?");
-if(indexOfQuestionMark!==-1)
-extension=extension.substr(0,indexOfQuestionMark);
-return extension;
-};
-
-
-
-
-
-WebInspector.ParsedURL.extractName=function(url)
-{
-var index=url.lastIndexOf("/");
-return index!==-1?url.substr(index+1):url;
-};
+},{}],156:[function(require,module,exports){
 
 
 
 
 
 
-WebInspector.ParsedURL.completeURL=function(baseURL,href)
-{
-if(href){
-
-var trimmedHref=href.trim();
-if(trimmedHref.startsWith("data:")||trimmedHref.startsWith("blob:")||trimmedHref.startsWith("javascript:"))
-return href;
+SDK.CSSProperty=class{
 
 
-var parsedHref=trimmedHref.asParsedURL();
-if(parsedHref&&parsedHref.scheme)
-return trimmedHref;
+
+
+
+
+
+
+
+
+
+
+constructor(ownerStyle,index,name,value,important,disabled,parsedOk,implicit,text,range){
+this.ownerStyle=ownerStyle;
+this.index=index;
+this.name=name;
+this.value=value;
+this.important=important;
+this.disabled=disabled;
+this.parsedOk=parsedOk;
+this.implicit=implicit;
+this.text=text;
+this.range=range?TextUtils.TextRange.fromObject(range):null;
+this._active=true;
+this._nameRange=null;
+this._valueRange=null;
+}
+
+
+
+
+
+
+
+static parsePayload(ownerStyle,index,payload){
+
+
+
+
+
+const result=new SDK.CSSProperty(
+ownerStyle,index,payload.name,payload.value,payload.important||false,payload.disabled||false,
+'parsedOk'in payload?!!payload.parsedOk:true,!!payload.implicit,payload.text,payload.range);
+return result;
+}
+
+_ensureRanges(){
+if(this._nameRange&&this._valueRange)
+return;
+const range=this.range;
+const text=this.text?new TextUtils.Text(this.text):null;
+if(!range||!text)
+return;
+
+const nameIndex=text.value().indexOf(this.name);
+const valueIndex=text.value().lastIndexOf(this.value);
+if(nameIndex===-1||valueIndex===-1||nameIndex>valueIndex)
+return;
+
+const nameSourceRange=new TextUtils.SourceRange(nameIndex,this.name.length);
+const valueSourceRange=new TextUtils.SourceRange(valueIndex,this.value.length);
+
+this._nameRange=rebase(text.toTextRange(nameSourceRange),range.startLine,range.startColumn);
+this._valueRange=rebase(text.toTextRange(valueSourceRange),range.startLine,range.startColumn);
+
+
+
+
+
+
+
+function rebase(oneLineRange,lineOffset,columnOffset){
+if(oneLineRange.startLine===0){
+oneLineRange.startColumn+=columnOffset;
+oneLineRange.endColumn+=columnOffset;
+}
+oneLineRange.startLine+=lineOffset;
+oneLineRange.endLine+=lineOffset;
+return oneLineRange;
+}
+}
+
+
+
+
+nameRange(){
+this._ensureRanges();
+return this._nameRange;
+}
+
+
+
+
+valueRange(){
+this._ensureRanges();
+return this._valueRange;
+}
+
+
+
+
+rebase(edit){
+if(this.ownerStyle.styleSheetId!==edit.styleSheetId)
+return;
+if(this.range)
+this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
+}
+
+
+
+
+setActive(active){
+this._active=active;
+}
+
+get propertyText(){
+if(this.text!==undefined)
+return this.text;
+
+if(this.name==='')
+return'';
+return this.name+': '+this.value+(this.important?' !important':'')+';';
+}
+
+
+
+
+activeInStyle(){
+return this._active;
+}
+
+
+
+
+
+
+
+setText(propertyText,majorChange,overwrite){
+if(!this.ownerStyle)
+return Promise.reject(new Error('No ownerStyle for property'));
+
+if(!this.ownerStyle.styleSheetId)
+return Promise.reject(new Error('No owner style id'));
+
+if(!this.range||!this.ownerStyle.range)
+return Promise.reject(new Error('Style not editable'));
+
+if(majorChange)
+Host.userMetrics.actionTaken(Host.UserMetrics.Action.StyleRuleEdited);
+
+if(overwrite&&propertyText===this.propertyText){
+this.ownerStyle.cssModel().domModel().markUndoableState(!majorChange);
+return Promise.resolve(true);
+}
+
+const range=this.range.relativeTo(this.ownerStyle.range.startLine,this.ownerStyle.range.startColumn);
+const indentation=this.ownerStyle.cssText?this._detectIndentation(this.ownerStyle.cssText):
+Common.moduleSetting('textEditorIndent').get();
+const endIndentation=this.ownerStyle.cssText?indentation.substring(0,this.ownerStyle.range.endColumn):'';
+const text=new TextUtils.Text(this.ownerStyle.cssText||'');
+const newStyleText=text.replaceRange(range,String.sprintf(';%s;',propertyText));
+
+return self.runtime.extension(TextUtils.TokenizerFactory).
+instance().
+then(this._formatStyle.bind(this,newStyleText,indentation,endIndentation)).
+then(setStyleText.bind(this));
+
+
+
+
+
+
+function setStyleText(styleText){
+return this.ownerStyle.setText(styleText,majorChange);
+}
+}
+
+
+
+
+
+
+
+
+_formatStyle(styleText,indentation,endIndentation,tokenizerFactory){
+if(indentation)
+indentation='\n'+indentation;
+let result='';
+let propertyText;
+let insideProperty=false;
+const tokenize=tokenizerFactory.createTokenizer('text/css');
+
+tokenize('*{'+styleText+'}',processToken);
+if(insideProperty)
+result+=propertyText;
+result=result.substring(2,result.length-1).trimRight();
+return result+(indentation?'\n'+endIndentation:'');
+
+
+
+
+
+
+
+function processToken(token,tokenType,column,newColumn){
+if(!insideProperty){
+const disabledProperty=tokenType&&tokenType.includes('css-comment')&&isDisabledProperty(token);
+const isPropertyStart=tokenType&&(
+tokenType.includes('css-string')||tokenType.includes('css-meta')||tokenType.includes('css-property')||
+tokenType.includes('css-variable-2'));
+if(disabledProperty){
+result=result.trimRight()+indentation+token;
+}else if(isPropertyStart){
+insideProperty=true;
+propertyText=token;
+}else if(token!==';'){
+result+=token;
+}
+return;
+}
+
+if(token==='}'||token===';'){
+result=result.trimRight()+indentation+propertyText.trim()+';';
+insideProperty=false;
+if(token==='}')
+result+='}';
 }else{
-return baseURL;
+propertyText+=token;
+}
 }
 
-var parsedURL=baseURL.asParsedURL();
-if(parsedURL){
-if(parsedURL.isDataURL())
-return href;
-var path=href;
 
-var query=path.indexOf("?");
-var postfix="";
-if(query!==-1){
-postfix=path.substring(query);
-path=path.substring(0,query);
+
+
+
+function isDisabledProperty(text){
+const colon=text.indexOf(':');
+if(colon===-1)
+return false;
+const propertyName=text.substring(2,colon).trim();
+return SDK.cssMetadata().isCSSPropertyName(propertyName);
+}
+}
+
+
+
+
+
+_detectIndentation(text){
+const lines=text.split('\n');
+if(lines.length<2)
+return'';
+return TextUtils.TextUtils.lineIndent(lines[1]);
+}
+
+
+
+
+
+
+
+setValue(newValue,majorChange,overwrite,userCallback){
+const text=this.name+': '+newValue+(this.important?' !important':'')+';';
+this.setText(text,majorChange,overwrite).then(userCallback);
+}
+
+
+
+
+
+setDisabled(disabled){
+if(!this.ownerStyle)
+return Promise.resolve(false);
+if(disabled===this.disabled)
+return Promise.resolve(true);
+const propertyText=this.text.trim();
+const text=disabled?'/* '+propertyText+' */':this.text.substring(2,propertyText.length-2).trim();
+return this.setText(text,true,true);
+}};
+
+
+},{}],157:[function(require,module,exports){
+
+
+
+
+
+
+SDK.CSSValue=class{
+
+
+
+constructor(payload){
+this.text=payload.text;
+if(payload.range)
+this.range=TextUtils.TextRange.fromObject(payload.range);
+}
+
+
+
+
+rebase(edit){
+if(!this.range)
+return;
+this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
+}};
+
+
+
+
+
+SDK.CSSRule=class{
+
+
+
+
+constructor(cssModel,payload){
+this._cssModel=cssModel;
+this.styleSheetId=payload.styleSheetId;
+
+if(this.styleSheetId){
+const styleSheetHeader=cssModel.styleSheetHeaderForId(this.styleSheetId);
+this.sourceURL=styleSheetHeader.sourceURL;
+}
+this.origin=payload.origin;
+this.style=new SDK.CSSStyleDeclaration(this._cssModel,this,payload.style,SDK.CSSStyleDeclaration.Type.Regular);
+}
+
+
+
+
+rebase(edit){
+if(this.styleSheetId!==edit.styleSheetId)
+return;
+this.style.rebase(edit);
+}
+
+
+
+
+resourceURL(){
+if(!this.styleSheetId)
+return'';
+const styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);
+return styleSheetHeader.resourceURL();
+}
+
+
+
+
+isUserAgent(){
+return this.origin===Protocol.CSS.StyleSheetOrigin.UserAgent;
+}
+
+
+
+
+isInjected(){
+return this.origin===Protocol.CSS.StyleSheetOrigin.Injected;
+}
+
+
+
+
+isViaInspector(){
+return this.origin===Protocol.CSS.StyleSheetOrigin.Inspector;
+}
+
+
+
+
+isRegular(){
+return this.origin===Protocol.CSS.StyleSheetOrigin.Regular;
+}
+
+
+
+
+cssModel(){
+return this._cssModel;
+}};
+
+
+
+
+
+SDK.CSSStyleRule=class extends SDK.CSSRule{
+
+
+
+
+
+constructor(cssModel,payload,wasUsed){
+super(cssModel,payload);
+
+this._reinitializeSelectors(payload.selectorList);
+this.media=payload.media?SDK.CSSMedia.parseMediaArrayPayload(cssModel,payload.media):[];
+this.wasUsed=wasUsed||false;
+}
+
+
+
+
+
+
+static createDummyRule(cssModel,selectorText){
+const dummyPayload={
+selectorList:{
+selectors:[{text:selectorText}]},
+
+style:{styleSheetId:'0',range:new TextUtils.TextRange(0,0,0,0),shorthandEntries:[],cssProperties:[]}};
+
+return new SDK.CSSStyleRule(cssModel,dummyPayload);
+}
+
+
+
+
+_reinitializeSelectors(selectorList){
+
+this.selectors=[];
+for(let i=0;i<selectorList.selectors.length;++i)
+this.selectors.push(new SDK.CSSValue(selectorList.selectors[i]));
+}
+
+
+
+
+
+setSelectorText(newSelector){
+const styleSheetId=this.styleSheetId;
+if(!styleSheetId)
+throw'No rule stylesheet id';
+const range=this.selectorRange();
+if(!range)
+throw'Rule selector is not editable';
+return this._cssModel.setSelectorText(styleSheetId,range,newSelector);
+}
+
+
+
+
+selectorText(){
+return this.selectors.select('text').join(', ');
+}
+
+
+
+
+selectorRange(){
+const firstRange=this.selectors[0].range;
+if(!firstRange)
+return null;
+const lastRange=this.selectors.peekLast().range;
+return new TextUtils.TextRange(
+firstRange.startLine,firstRange.startColumn,lastRange.endLine,lastRange.endColumn);
+}
+
+
+
+
+
+lineNumberInSource(selectorIndex){
+const selector=this.selectors[selectorIndex];
+if(!selector||!selector.range||!this.styleSheetId)
+return 0;
+const styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);
+return styleSheetHeader.lineNumberInSource(selector.range.startLine);
+}
+
+
+
+
+
+columnNumberInSource(selectorIndex){
+const selector=this.selectors[selectorIndex];
+if(!selector||!selector.range||!this.styleSheetId)
+return undefined;
+const styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);
+console.assert(styleSheetHeader);
+return styleSheetHeader.columnNumberInSource(selector.range.startLine,selector.range.startColumn);
+}
+
+
+
+
+
+rebase(edit){
+if(this.styleSheetId!==edit.styleSheetId)
+return;
+if(this.selectorRange().equal(edit.oldRange)){
+this._reinitializeSelectors(edit.payload);
 }else{
-var fragment=path.indexOf("#");
-if(fragment!==-1){
-postfix=path.substring(fragment);
-path=path.substring(0,fragment);
+for(let i=0;i<this.selectors.length;++i)
+this.selectors[i].rebase(edit);
 }
-}
+for(const media of this.media)
+media.rebase(edit);
 
-if(!path){
-var basePath=parsedURL.path;
-if(postfix.charAt(0)==="?"){
-
-
-var baseQuery=parsedURL.path.indexOf("?");
-if(baseQuery!==-1)
-basePath=basePath.substring(0,baseQuery);
-}
-return parsedURL.scheme+"://"+parsedURL.host+(parsedURL.port?":"+parsedURL.port:"")+basePath+postfix;
-}else if(path.charAt(0)!=="/"){
-var prefix=parsedURL.path;
-var prefixQuery=prefix.indexOf("?");
-if(prefixQuery!==-1)
-prefix=prefix.substring(0,prefixQuery);
-prefix=prefix.substring(0,prefix.lastIndexOf("/"))+"/";
-path=prefix+path;
-}else if(path.length>1&&path.charAt(1)==="/"){
-
-return parsedURL.scheme+":"+path+postfix;
-}
-return parsedURL.scheme+"://"+parsedURL.host+(parsedURL.port?":"+parsedURL.port:"")+Runtime.normalizePath(path)+postfix;
-}
-return null;
-};
-
-WebInspector.ParsedURL.prototype={
-get displayName()
-{
-if(this._displayName)
-return this._displayName;
-
-if(this.isDataURL())
-return this.dataURLDisplayName();
-if(this.isAboutBlank())
-return this.url;
-
-this._displayName=this.lastPathComponent;
-if(!this._displayName)
-this._displayName=(this.host||"")+"/";
-if(this._displayName==="/")
-this._displayName=this.url;
-return this._displayName;
-},
-
-
-
-
-dataURLDisplayName:function()
-{
-if(this._dataURLDisplayName)
-return this._dataURLDisplayName;
-if(!this.isDataURL())
-return"";
-this._dataURLDisplayName=this.url.trimEnd(20);
-return this._dataURLDisplayName;
-},
-
-
-
-
-isAboutBlank:function()
-{
-return this.url==="about:blank";
-},
-
-
-
-
-isDataURL:function()
-{
-return this.scheme==="data";
-},
-
-
-
-
-lastPathComponentWithFragment:function()
-{
-return this.lastPathComponent+(this.fragment?"#"+this.fragment:"");
-},
-
-
-
-
-domain:function()
-{
-if(this.isDataURL())
-return"data:";
-return this.host+(this.port?":"+this.port:"");
-},
-
-
-
-
-securityOrigin:function()
-{
-if(this.isDataURL())
-return"data:";
-return this.scheme+"://"+this.domain();
-},
-
-
-
-
-urlWithoutScheme:function()
-{
-if(this.scheme&&this.url.startsWith(this.scheme+"://"))
-return this.url.substring(this.scheme.length+3);
-return this.url;
+super.rebase(edit);
 }};
 
 
@@ -46059,162 +66769,660 @@
 
 
 
-WebInspector.ParsedURL.splitLineAndColumn=function(string)
-{
-var lineColumnRegEx=/(?::(\d+))?(?::(\d+))?$/;
-var lineColumnMatch=lineColumnRegEx.exec(string);
-var lineNumber;
-var columnNumber;
-console.assert(lineColumnMatch);
+SDK.CSSKeyframesRule=class{
 
-if(typeof lineColumnMatch[1]==="string"){
-lineNumber=parseInt(lineColumnMatch[1],10);
 
-lineNumber=isNaN(lineNumber)?undefined:lineNumber-1;
-}
-if(typeof lineColumnMatch[2]==="string"){
-columnNumber=parseInt(lineColumnMatch[2],10);
-columnNumber=isNaN(columnNumber)?undefined:columnNumber-1;
+
+
+constructor(cssModel,payload){
+this._cssModel=cssModel;
+this._animationName=new SDK.CSSValue(payload.animationName);
+this._keyframes=payload.keyframes.map(keyframeRule=>new SDK.CSSKeyframeRule(cssModel,keyframeRule));
 }
 
-return{url:string.substring(0,string.length-lineColumnMatch[0].length),lineNumber:lineNumber,columnNumber:columnNumber};
-};
+
+
+
+name(){
+return this._animationName;
+}
 
 
 
 
-
-WebInspector.ParsedURL.isRelativeURL=function(url)
-{
-return!/^[A-Za-z][A-Za-z0-9+.-]*:/.test(url);
-};
-
-
-
-
-String.prototype.asParsedURL=function()
-{
-var parsedURL=new WebInspector.ParsedURL(this.toString());
-if(parsedURL.isValid)
-return parsedURL;
-return null;
-};
-
-},{}],102:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-WebInspector.Segment=function(begin,end,data)
-{
-if(begin>end)
-console.assert(false,"Invalid segment");
-this.begin=begin;
-this.end=end;
-this.data=data;
-};
-
-WebInspector.Segment.prototype={
-
-
-
-
-intersects:function(that)
-{
-return this.begin<that.end&&that.begin<this.end;
+keyframes(){
+return this._keyframes;
 }};
 
 
 
 
 
-
-WebInspector.SegmentedRange=function(mergeCallback)
-{
-
-this._segments=[];
-this._mergeCallback=mergeCallback;
-};
-
-WebInspector.SegmentedRange.prototype={
+SDK.CSSKeyframeRule=class extends SDK.CSSRule{
 
 
 
-append:function(newSegment)
-{
 
-var startIndex=this._segments.lowerBound(newSegment,(a,b)=>a.begin-b.begin);
-var endIndex=startIndex;
-var merged=null;
-if(startIndex>0){
-
-var precedingSegment=this._segments[startIndex-1];
-merged=this._tryMerge(precedingSegment,newSegment);
-if(merged){
---startIndex;
-newSegment=merged;
-}else if(this._segments[startIndex-1].end>=newSegment.begin){
-
-
-if(newSegment.end<precedingSegment.end)
-this._segments.splice(startIndex,0,new WebInspector.Segment(newSegment.end,precedingSegment.end,precedingSegment.data));
-precedingSegment.end=newSegment.begin;
-}
+constructor(cssModel,payload){
+super(cssModel,payload);
+this._reinitializeKey(payload.keyText);
 }
 
-while(endIndex<this._segments.length&&this._segments[endIndex].end<=newSegment.end)
-++endIndex;
 
-if(endIndex<this._segments.length){
-merged=this._tryMerge(newSegment,this._segments[endIndex]);
-if(merged){
-endIndex++;
-newSegment=merged;
-}else if(newSegment.intersects(this._segments[endIndex]))
-this._segments[endIndex].begin=newSegment.end;
+
+
+key(){
+return this._keyText;
 }
-this._segments.splice(startIndex,endIndex-startIndex,newSegment);
-},
 
 
 
 
-appendRange:function(that)
-{
-that.segments().forEach(segment=>this.append(segment));
-},
-
-
-
-
-segments:function()
-{
-return this._segments;
-},
+_reinitializeKey(payload){
+this._keyText=new SDK.CSSValue(payload);
+}
 
 
 
 
 
+rebase(edit){
+if(this.styleSheetId!==edit.styleSheetId||!this._keyText.range)
+return;
+if(edit.oldRange.equal(this._keyText.range))
+this._reinitializeKey(edit.payload);else
 
-_tryMerge:function(first,second)
-{
-var merged=this._mergeCallback&&this._mergeCallback(first,second);
-if(!merged)
-return null;
-merged.begin=first.begin;
-merged.end=Math.max(first.end,second.end);
-return merged;
+this._keyText.rebase(edit);
+
+super.rebase(edit);
+}
+
+
+
+
+
+setKeyText(newKeyText){
+const styleSheetId=this.styleSheetId;
+if(!styleSheetId)
+throw'No rule stylesheet id';
+const range=this._keyText.range;
+if(!range)
+throw'Keyframe key is not editable';
+return this._cssModel.setKeyframeKey(styleSheetId,range,newKeyText);
 }};
 
 
-},{}],103:[function(require,module,exports){
+},{}],158:[function(require,module,exports){
+
+
+
+SDK.CSSStyleDeclaration=class{
+
+
+
+
+
+
+constructor(cssModel,parentRule,payload,type){
+this._cssModel=cssModel;
+this.parentRule=parentRule;
+
+this._allProperties;
+
+this.styleSheetId;
+
+this.range;
+
+this.cssText;
+
+this._shorthandValues;
+
+this._shorthandIsImportant;
+
+this._activePropertyMap;
+
+this._leadingProperties;
+this._reinitialize(payload);
+this.type=type;
+}
+
+
+
+
+rebase(edit){
+if(this.styleSheetId!==edit.styleSheetId||!this.range)
+return;
+if(edit.oldRange.equal(this.range)){
+this._reinitialize(edit.payload);
+}else{
+this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
+for(let i=0;i<this._allProperties.length;++i)
+this._allProperties[i].rebase(edit);
+}
+}
+
+
+
+
+_reinitialize(payload){
+this.styleSheetId=payload.styleSheetId;
+this.range=payload.range?TextUtils.TextRange.fromObject(payload.range):null;
+
+const shorthandEntries=payload.shorthandEntries;
+this._shorthandValues=new Map();
+this._shorthandIsImportant=new Set();
+for(let i=0;i<shorthandEntries.length;++i){
+this._shorthandValues.set(shorthandEntries[i].name,shorthandEntries[i].value);
+if(shorthandEntries[i].important)
+this._shorthandIsImportant.add(shorthandEntries[i].name);
+}
+
+this._allProperties=[];
+
+if(payload.cssText&&this.range){
+const cssText=new TextUtils.Text(payload.cssText);
+let start={line:this.range.startLine,column:this.range.startColumn};
+for(const cssProperty of payload.cssProperties){
+const range=cssProperty.range;
+if(range){
+parseUnusedText.call(this,cssText,start.line,start.column,range.startLine,range.startColumn);
+start={line:range.endLine,column:range.endColumn};
+}
+this._allProperties.push(SDK.CSSProperty.parsePayload(this,this._allProperties.length,cssProperty));
+}
+parseUnusedText.call(this,cssText,start.line,start.column,this.range.endLine,this.range.endColumn);
+}else{
+for(const cssProperty of payload.cssProperties)
+this._allProperties.push(SDK.CSSProperty.parsePayload(this,this._allProperties.length,cssProperty));
+}
+
+this._generateSyntheticPropertiesIfNeeded();
+this._computeInactiveProperties();
+
+this._activePropertyMap=new Map();
+for(const property of this._allProperties){
+if(!property.activeInStyle())
+continue;
+this._activePropertyMap.set(property.name,property);
+}
+
+this.cssText=payload.cssText;
+this._leadingProperties=null;
+
+
+
+
+
+
+
+
+
+function parseUnusedText(cssText,startLine,startColumn,endLine,endColumn){
+const tr=new TextUtils.TextRange(startLine,startColumn,endLine,endColumn);
+const missingText=cssText.extract(tr.relativeTo(this.range.startLine,this.range.startColumn));
+
+
+const lines=missingText.split('\n');
+let lineNumber=0;
+let inComment=false;
+for(const line of lines){
+let column=0;
+for(const property of line.split(';')){
+const strippedProperty=stripComments(property,inComment);
+const trimmedProperty=strippedProperty.text.trim();
+inComment=strippedProperty.inComment;
+
+if(trimmedProperty){
+let name;
+let value;
+const colonIndex=trimmedProperty.indexOf(':');
+if(colonIndex===-1){
+name=trimmedProperty;
+value='';
+}else{
+name=trimmedProperty.substring(0,colonIndex).trim();
+value=trimmedProperty.substring(colonIndex+1).trim();
+}
+const range=new TextUtils.TextRange(lineNumber,column,lineNumber,column+property.length);
+this._allProperties.push(new SDK.CSSProperty(
+this,this._allProperties.length,name,value,false,false,false,false,property,
+range.relativeFrom(startLine,startColumn)));
+}
+column+=property.length+1;
+}
+lineNumber++;
+}
+}
+
+
+
+
+
+
+function stripComments(text,inComment){
+let output='';
+for(let i=0;i<text.length;i++){
+if(!inComment&&text.substring(i,i+2)==='/*'){
+inComment=true;
+i++;
+}else if(inComment&&text.substring(i,i+2)==='*/'){
+inComment=false;
+i++;
+}else if(!inComment){
+output+=text[i];
+}
+}
+return{text:output,inComment};
+}
+}
+
+_generateSyntheticPropertiesIfNeeded(){
+if(this.range)
+return;
+
+if(!this._shorthandValues.size)
+return;
+
+const propertiesSet=new Set();
+for(const property of this._allProperties)
+propertiesSet.add(property.name);
+
+const generatedProperties=[];
+
+for(const property of this._allProperties){
+
+const shorthands=SDK.cssMetadata().shorthands(property.name)||[];
+for(const shorthand of shorthands){
+if(propertiesSet.has(shorthand))
+continue;
+const shorthandValue=this._shorthandValues.get(shorthand);
+if(!shorthandValue)
+continue;
+
+
+const shorthandImportance=!!this._shorthandIsImportant.has(shorthand);
+const shorthandProperty=new SDK.CSSProperty(
+this,this.allProperties().length,shorthand,shorthandValue,shorthandImportance,false,true,false);
+generatedProperties.push(shorthandProperty);
+propertiesSet.add(shorthand);
+}
+}
+this._allProperties=this._allProperties.concat(generatedProperties);
+}
+
+
+
+
+_computeLeadingProperties(){
+
+
+
+
+function propertyHasRange(property){
+return!!property.range;
+}
+
+if(this.range)
+return this._allProperties.filter(propertyHasRange);
+
+const leadingProperties=[];
+for(const property of this._allProperties){
+const shorthands=SDK.cssMetadata().shorthands(property.name)||[];
+let belongToAnyShorthand=false;
+for(const shorthand of shorthands){
+if(this._shorthandValues.get(shorthand)){
+belongToAnyShorthand=true;
+break;
+}
+}
+if(!belongToAnyShorthand)
+leadingProperties.push(property);
+}
+
+return leadingProperties;
+}
+
+
+
+
+leadingProperties(){
+if(!this._leadingProperties)
+this._leadingProperties=this._computeLeadingProperties();
+return this._leadingProperties;
+}
+
+
+
+
+target(){
+return this._cssModel.target();
+}
+
+
+
+
+cssModel(){
+return this._cssModel;
+}
+
+_computeInactiveProperties(){
+const activeProperties={};
+for(let i=0;i<this._allProperties.length;++i){
+const property=this._allProperties[i];
+if(property.disabled||!property.parsedOk){
+property.setActive(false);
+continue;
+}
+const canonicalName=SDK.cssMetadata().canonicalPropertyName(property.name);
+const activeProperty=activeProperties[canonicalName];
+if(!activeProperty){
+activeProperties[canonicalName]=property;
+}else if(!activeProperty.important||property.important){
+activeProperty.setActive(false);
+activeProperties[canonicalName]=property;
+}else{
+property.setActive(false);
+}
+}
+}
+
+
+
+
+allProperties(){
+return this._allProperties;
+}
+
+
+
+
+
+getPropertyValue(name){
+const property=this._activePropertyMap.get(name);
+return property?property.value:'';
+}
+
+
+
+
+
+isPropertyImplicit(name){
+const property=this._activePropertyMap.get(name);
+return property?property.implicit:false;
+}
+
+
+
+
+
+longhandProperties(name){
+const longhands=SDK.cssMetadata().longhands(name);
+const result=[];
+for(let i=0;longhands&&i<longhands.length;++i){
+const property=this._activePropertyMap.get(longhands[i]);
+if(property)
+result.push(property);
+}
+return result;
+}
+
+
+
+
+
+propertyAt(index){
+return index<this.allProperties().length?this.allProperties()[index]:null;
+}
+
+
+
+
+pastLastSourcePropertyIndex(){
+for(let i=this.allProperties().length-1;i>=0;--i){
+if(this.allProperties()[i].range)
+return i+1;
+}
+return 0;
+}
+
+
+
+
+
+_insertionRange(index){
+const property=this.propertyAt(index);
+return property&&property.range?property.range.collapseToStart():this.range.collapseToEnd();
+}
+
+
+
+
+
+newBlankProperty(index){
+index=typeof index==='undefined'?this.pastLastSourcePropertyIndex():index;
+const property=
+new SDK.CSSProperty(this,index,'','',false,false,true,false,'',this._insertionRange(index));
+return property;
+}
+
+
+
+
+
+
+setText(text,majorChange){
+if(!this.range||!this.styleSheetId)
+return Promise.resolve(false);
+return this._cssModel.setStyleText(this.styleSheetId,this.range,text,majorChange);
+}
+
+
+
+
+
+
+
+insertPropertyAt(index,name,value,userCallback){
+this.newBlankProperty(index).setText(name+': '+value+';',false,true).then(userCallback);
+}
+
+
+
+
+
+
+appendProperty(name,value,userCallback){
+this.insertPropertyAt(this.allProperties().length,name,value,userCallback);
+}};
+
+
+
+SDK.CSSStyleDeclaration.Type={
+Regular:'Regular',
+Inline:'Inline',
+Attributes:'Attributes'};
+
+
+},{}],159:[function(require,module,exports){
+
+
+
+
+
+
+
+TextUtils.Text=class{
+
+
+
+constructor(value){
+this._value=value;
+}
+
+
+
+
+lineEndings(){
+if(!this._lineEndings)
+this._lineEndings=this._value.computeLineEndings();
+return this._lineEndings;
+}
+
+
+
+
+value(){
+return this._value;
+}
+
+
+
+
+lineCount(){
+const lineEndings=this.lineEndings();
+return lineEndings.length;
+}
+
+
+
+
+
+
+offsetFromPosition(lineNumber,columnNumber){
+return(lineNumber?this.lineEndings()[lineNumber-1]+1:0)+columnNumber;
+}
+
+
+
+
+
+positionFromOffset(offset){
+const lineEndings=this.lineEndings();
+const lineNumber=lineEndings.lowerBound(offset);
+return{lineNumber:lineNumber,columnNumber:offset-(lineNumber&&lineEndings[lineNumber-1]+1)};
+}
+
+
+
+
+lineAt(lineNumber){
+const lineEndings=this.lineEndings();
+const lineStart=lineNumber>0?lineEndings[lineNumber-1]+1:0;
+const lineEnd=lineEndings[lineNumber];
+let lineContent=this._value.substring(lineStart,lineEnd);
+if(lineContent.length>0&&lineContent.charAt(lineContent.length-1)==='\r')
+lineContent=lineContent.substring(0,lineContent.length-1);
+return lineContent;
+}
+
+
+
+
+
+toSourceRange(range){
+const start=this.offsetFromPosition(range.startLine,range.startColumn);
+const end=this.offsetFromPosition(range.endLine,range.endColumn);
+return new TextUtils.SourceRange(start,end-start);
+}
+
+
+
+
+
+toTextRange(sourceRange){
+const cursor=new TextUtils.TextCursor(this.lineEndings());
+const result=TextUtils.TextRange.createFromLocation(0,0);
+
+cursor.resetTo(sourceRange.offset);
+result.startLine=cursor.lineNumber();
+result.startColumn=cursor.columnNumber();
+
+cursor.advance(sourceRange.offset+sourceRange.length);
+result.endLine=cursor.lineNumber();
+result.endColumn=cursor.columnNumber();
+return result;
+}
+
+
+
+
+
+
+replaceRange(range,replacement){
+const sourceRange=this.toSourceRange(range);
+return this._value.substring(0,sourceRange.offset)+replacement+
+this._value.substring(sourceRange.offset+sourceRange.length);
+}
+
+
+
+
+
+extract(range){
+const sourceRange=this.toSourceRange(range);
+return this._value.substr(sourceRange.offset,sourceRange.length);
+}};
+
+
+
+TextUtils.Text.Position;
+
+
+
+
+TextUtils.TextCursor=class{
+
+
+
+constructor(lineEndings){
+this._lineEndings=lineEndings;
+this._offset=0;
+this._lineNumber=0;
+this._columnNumber=0;
+}
+
+
+
+
+advance(offset){
+this._offset=offset;
+while(this._lineNumber<this._lineEndings.length&&this._lineEndings[this._lineNumber]<this._offset)
+++this._lineNumber;
+this._columnNumber=this._lineNumber?this._offset-this._lineEndings[this._lineNumber-1]-1:this._offset;
+}
+
+
+
+
+offset(){
+return this._offset;
+}
+
+
+
+
+resetTo(offset){
+this._offset=offset;
+this._lineNumber=this._lineEndings.lowerBound(offset);
+this._columnNumber=this._lineNumber?this._offset-this._lineEndings[this._lineNumber-1]-1:this._offset;
+}
+
+
+
+
+lineNumber(){
+return this._lineNumber;
+}
+
+
+
+
+columnNumber(){
+return this._columnNumber;
+}};
+
+
+},{}],160:[function(require,module,exports){
 
 
 
@@ -46248,150 +67456,155 @@
 
 
 
+TextUtils.TextRange=class{
 
 
 
 
-WebInspector.TextRange=function(startLine,startColumn,endLine,endColumn)
-{
+
+
+constructor(startLine,startColumn,endLine,endColumn){
 this.startLine=startLine;
 this.startColumn=startColumn;
 this.endLine=endLine;
 this.endColumn=endColumn;
-};
+}
 
 
 
 
 
 
-WebInspector.TextRange.createFromLocation=function(line,column)
-{
-return new WebInspector.TextRange(line,column,line,column);
-};
+static createFromLocation(line,column){
+return new TextUtils.TextRange(line,column,line,column);
+}
 
 
 
 
 
-WebInspector.TextRange.fromObject=function(serializedTextRange)
-{
-return new WebInspector.TextRange(serializedTextRange.startLine,serializedTextRange.startColumn,serializedTextRange.endLine,serializedTextRange.endColumn);
-};
+static fromObject(serializedTextRange){
+return new TextUtils.TextRange(
+serializedTextRange.startLine,serializedTextRange.startColumn,serializedTextRange.endLine,
+serializedTextRange.endColumn);
+}
 
 
 
 
 
 
-WebInspector.TextRange.comparator=function(range1,range2)
-{
+static comparator(range1,range2){
 return range1.compareTo(range2);
-};
-
-WebInspector.TextRange.prototype={
+}
 
 
 
-isEmpty:function()
-{
+
+
+
+static fromEdit(oldRange,newText){
+let endLine=oldRange.startLine;
+let endColumn=oldRange.startColumn+newText.length;
+const lineEndings=newText.computeLineEndings();
+if(lineEndings.length>1){
+endLine=oldRange.startLine+lineEndings.length-1;
+const len=lineEndings.length;
+endColumn=lineEndings[len-1]-lineEndings[len-2]-1;
+}
+return new TextUtils.TextRange(oldRange.startLine,oldRange.startColumn,endLine,endColumn);
+}
+
+
+
+
+isEmpty(){
 return this.startLine===this.endLine&&this.startColumn===this.endColumn;
-},
+}
 
 
 
 
 
-immediatelyPrecedes:function(range)
-{
+immediatelyPrecedes(range){
 if(!range)
 return false;
 return this.endLine===range.startLine&&this.endColumn===range.startColumn;
-},
+}
 
 
 
 
 
-immediatelyFollows:function(range)
-{
+immediatelyFollows(range){
 if(!range)
 return false;
 return range.immediatelyPrecedes(this);
-},
+}
 
 
 
 
 
-follows:function(range)
-{
-return range.endLine===this.startLine&&range.endColumn<=this.startColumn||
-range.endLine<this.startLine;
-},
+follows(range){
+return range.endLine===this.startLine&&range.endColumn<=this.startColumn||range.endLine<this.startLine;
+}
 
 
 
 
-get linesCount()
-{
+get linesCount(){
 return this.endLine-this.startLine;
-},
+}
 
 
 
 
-collapseToEnd:function()
-{
-return new WebInspector.TextRange(this.endLine,this.endColumn,this.endLine,this.endColumn);
-},
+collapseToEnd(){
+return new TextUtils.TextRange(this.endLine,this.endColumn,this.endLine,this.endColumn);
+}
 
 
 
 
-collapseToStart:function()
-{
-return new WebInspector.TextRange(this.startLine,this.startColumn,this.startLine,this.startColumn);
-},
+collapseToStart(){
+return new TextUtils.TextRange(this.startLine,this.startColumn,this.startLine,this.startColumn);
+}
 
 
 
 
-normalize:function()
-{
+normalize(){
 if(this.startLine>this.endLine||this.startLine===this.endLine&&this.startColumn>this.endColumn)
-return new WebInspector.TextRange(this.endLine,this.endColumn,this.startLine,this.startColumn);else
+return new TextUtils.TextRange(this.endLine,this.endColumn,this.startLine,this.startColumn);else
 
 return this.clone();
-},
+}
 
 
 
 
-clone:function()
-{
-return new WebInspector.TextRange(this.startLine,this.startColumn,this.endLine,this.endColumn);
-},
+clone(){
+return new TextUtils.TextRange(this.startLine,this.startColumn,this.endLine,this.endColumn);
+}
 
 
 
 
-serializeToObject:function()
-{
-var serializedTextRange={};
+serializeToObject(){
+const serializedTextRange={};
 serializedTextRange.startLine=this.startLine;
 serializedTextRange.startColumn=this.startColumn;
 serializedTextRange.endLine=this.endLine;
 serializedTextRange.endColumn=this.endColumn;
 return serializedTextRange;
-},
+}
 
 
 
 
 
-compareTo:function(other)
-{
+compareTo(other){
 if(this.startLine>other.startLine)
 return 1;
 if(this.startLine<other.startLine)
@@ -46401,40 +67614,37 @@
 if(this.startColumn<other.startColumn)
 return-1;
 return 0;
-},
+}
 
 
 
 
 
 
-compareToPosition:function(lineNumber,columnNumber)
-{
+compareToPosition(lineNumber,columnNumber){
 if(lineNumber<this.startLine||lineNumber===this.startLine&&columnNumber<this.startColumn)
 return-1;
 if(lineNumber>this.endLine||lineNumber===this.endLine&&columnNumber>this.endColumn)
 return 1;
 return 0;
-},
+}
 
 
 
 
 
-equal:function(other)
-{
+equal(other){
 return this.startLine===other.startLine&&this.endLine===other.endLine&&
 this.startColumn===other.startColumn&&this.endColumn===other.endColumn;
-},
+}
 
 
 
 
 
 
-relativeTo:function(line,column)
-{
-var relative=this.clone();
+relativeTo(line,column){
+const relative=this.clone();
 
 if(this.startLine===line)
 relative.startColumn-=column;
@@ -46444,22 +67654,39 @@
 relative.startLine-=line;
 relative.endLine-=line;
 return relative;
-},
+}
 
 
 
 
 
 
-rebaseAfterTextEdit:function(originalRange,editedRange)
-{
+relativeFrom(line,column){
+const relative=this.clone();
+
+if(this.startLine===0)
+relative.startColumn+=column;
+if(this.endLine===0)
+relative.endColumn+=column;
+
+relative.startLine+=line;
+relative.endLine+=line;
+return relative;
+}
+
+
+
+
+
+
+rebaseAfterTextEdit(originalRange,editedRange){
 console.assert(originalRange.startLine===editedRange.startLine);
 console.assert(originalRange.startColumn===editedRange.startColumn);
-var rebase=this.clone();
+const rebase=this.clone();
 if(!this.follows(originalRange))
 return rebase;
-var lineDelta=editedRange.endLine-originalRange.endLine;
-var columnDelta=editedRange.endColumn-originalRange.endColumn;
+const lineDelta=editedRange.endLine-originalRange.endLine;
+const columnDelta=editedRange.endColumn-originalRange.endColumn;
 rebase.startLine+=lineDelta;
 rebase.endLine+=lineDelta;
 if(rebase.startLine===editedRange.endLine)
@@ -46467,24 +67694,22 @@
 if(rebase.endLine===editedRange.endLine)
 rebase.endColumn+=columnDelta;
 return rebase;
-},
+}
 
 
 
 
 
-toString:function()
-{
+toString(){
 return JSON.stringify(this);
-},
+}
 
 
 
 
 
 
-containsLocation:function(lineNumber,columnNumber)
-{
+containsLocation(lineNumber,columnNumber){
 if(this.startLine===this.endLine)
 return this.startLine===lineNumber&&this.startColumn<=columnNumber&&columnNumber<=this.endColumn;
 if(this.startLine===lineNumber)
@@ -46499,6005 +67724,722 @@
 
 
 
-
-WebInspector.TextRange.fromEdit=function(oldRange,newText)
-{
-var endLine=oldRange.startLine;
-var endColumn=oldRange.startColumn+newText.length;
-var lineEndings=newText.computeLineEndings();
-if(lineEndings.length>1){
-endLine=oldRange.startLine+lineEndings.length-1;
-var len=lineEndings.length;
-endColumn=lineEndings[len-1]-lineEndings[len-2]-1;
-}
-return new WebInspector.TextRange(
-oldRange.startLine,
-oldRange.startColumn,
-endLine,
-endColumn);
-};
+TextUtils.SourceRange=class{
 
 
 
 
-
-
-WebInspector.SourceRange=function(offset,length)
-{
+constructor(offset,length){
 this.offset=offset;
 this.length=length;
-};
+}};
 
 
 
 
 
+TextUtils.SourceEdit=class{
 
 
-WebInspector.SourceEdit=function(sourceURL,oldRange,newText)
-{
+
+
+
+constructor(sourceURL,oldRange,newText){
 this.sourceURL=sourceURL;
 this.oldRange=oldRange;
 this.newText=newText;
-};
-
-WebInspector.SourceEdit.prototype={
+}
 
 
 
-newRange:function()
-{
-return WebInspector.TextRange.fromEdit(this.oldRange,this.newText);
+
+
+
+static comparator(edit1,edit2){
+return TextUtils.TextRange.comparator(edit1.oldRange,edit2.oldRange);
+}
+
+
+
+
+newRange(){
+return TextUtils.TextRange.fromEdit(this.oldRange,this.newText);
 }};
 
 
+},{}],161:[function(require,module,exports){
 
 
 
 
+'use strict';
 
-WebInspector.SourceEdit.comparator=function(edit1,edit2)
-{
-return WebInspector.TextRange.comparator(edit1.oldRange,edit2.oldRange);
-};
+exports.TYPES={
+INTEGER:1,
+NUMBER:2,
+LENGTH:3,
+PERCENT:4,
+URL:5,
+COLOR:6,
+STRING:7,
+ANGLE:8,
+KEYWORD:9,
+NULL_OR_EMPTY_STR:10};
 
-},{}],104:[function(require,module,exports){
 
 
 
+var integerRegEx=/^[\-+]?[0-9]+$/;
+var numberRegEx=/^[\-+]?[0-9]*\.[0-9]+$/;
+var lengthRegEx=/^(0|[\-+]?[0-9]*\.?[0-9]+(in|cm|em|mm|pt|pc|px|ex|rem|vh|vw))$/;
+var percentRegEx=/^[\-+]?[0-9]*\.?[0-9]+%$/;
+var urlRegEx=/^url\(\s*([^\)]*)\s*\)$/;
+var stringRegEx=/^(\"[^\"]*\"|\'[^\']*\')$/;
+var colorRegEx1=/^#[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])?$/;
+var colorRegEx2=/^rgb\(([^\)]*)\)$/;
+var colorRegEx3=/^rgba\(([^\)]*)\)$/;
+var angleRegEx=/^([\-+]?[0-9]*\.?[0-9]+)(deg|grad|rad)$/;
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.TextUtils={
-
-
-
-
-isStopChar:function(char)
-{
-return char>" "&&char<"0"||
-char>"9"&&char<"A"||
-char>"Z"&&char<"_"||
-char>"_"&&char<"a"||
-char>"z"&&char<="~";
-},
-
-
-
-
-
-isWordChar:function(char)
-{
-return!WebInspector.TextUtils.isStopChar(char)&&!WebInspector.TextUtils.isSpaceChar(char);
-},
-
-
-
-
-
-isSpaceChar:function(char)
-{
-return WebInspector.TextUtils._SpaceCharRegex.test(char);
-},
-
-
-
-
-
-isWord:function(word)
-{
-for(var i=0;i<word.length;++i){
-if(!WebInspector.TextUtils.isWordChar(word.charAt(i)))
-return false;
+exports.valueType=function valueType(val){
+if(val===''||val===null){
+return exports.TYPES.NULL_OR_EMPTY_STR;
 }
-return true;
-},
-
-
-
-
-
-isOpeningBraceChar:function(char)
-{
-return char==="("||char==="{";
-},
-
-
-
-
-
-isClosingBraceChar:function(char)
-{
-return char===")"||char==="}";
-},
-
-
-
-
-
-isBraceChar:function(char)
-{
-return WebInspector.TextUtils.isOpeningBraceChar(char)||WebInspector.TextUtils.isClosingBraceChar(char);
-},
-
-
-
-
-
-
-textToWords:function(text,isWordChar,wordCallback)
-{
-var startWord=-1;
-for(var i=0;i<text.length;++i){
-if(!isWordChar(text.charAt(i))){
-if(startWord!==-1)
-wordCallback(text.substring(startWord,i));
-startWord=-1;
-}else if(startWord===-1)
-startWord=i;
+if(typeof val==='number'){
+val=val.toString();
 }
-if(startWord!==-1)
-wordCallback(text.substring(startWord));
-},
 
-
-
-
-
-lineIndent:function(line)
-{
-var indentation=0;
-while(indentation<line.length&&WebInspector.TextUtils.isSpaceChar(line.charAt(indentation)))
-++indentation;
-return line.substr(0,indentation);
-},
-
-
-
-
-
-isUpperCase:function(text)
-{
-return text===text.toUpperCase();
-},
-
-
-
-
-
-isLowerCase:function(text)
-{
-return text===text.toLowerCase();
-},
-
-
-
-
-
-
-splitStringByRegexes(text,regexes)
-{
-var matches=[];
-var globalRegexes=[];
-for(var i=0;i<regexes.length;i++){
-var regex=regexes[i];
-if(!regex.global)
-globalRegexes.push(new RegExp(regex.source,regex.flags?regex.flags+"g":"g"));else
-
-globalRegexes.push(regex);
-}
-doSplit(text,0,0);
-return matches;
-
-
-
-
-
-
-function doSplit(text,regexIndex,startIndex)
-{
-if(regexIndex>=globalRegexes.length){
-
-matches.push({
-value:text,
-position:startIndex,
-regexIndex:-1});
-
-return;
-}
-var regex=globalRegexes[regexIndex];
-var currentIndex=0;
-var result;
-regex.lastIndex=0;
-while((result=regex.exec(text))!==null){
-var stringBeforeMatch=text.substring(currentIndex,result.index);
-if(stringBeforeMatch)
-doSplit(stringBeforeMatch,regexIndex+1,startIndex+currentIndex);
-var match=result[0];
-matches.push({
-value:match,
-position:startIndex+result.index,
-regexIndex:regexIndex});
-
-currentIndex=result.index+match.length;
-}
-var stringAfterMatches=text.substring(currentIndex);
-if(stringAfterMatches)
-doSplit(stringAfterMatches,regexIndex+1,startIndex+currentIndex);
-}
-}};
-
-
-WebInspector.TextUtils._SpaceCharRegex=/\s/;
-
-
-
-
-WebInspector.TextUtils.Indent={
-TwoSpaces:"  ",
-FourSpaces:"    ",
-EightSpaces:"        ",
-TabCharacter:"\t"};
-
-
-
-
-
-
-
-WebInspector.TextUtils.BalancedJSONTokenizer=function(callback,findMultiple)
-{
-this._callback=callback;
-this._index=0;
-this._balance=0;
-this._buffer="";
-this._findMultiple=findMultiple||false;
-this._closingDoubleQuoteRegex=/[^\\](?:\\\\)*"/g;
-};
-
-WebInspector.TextUtils.BalancedJSONTokenizer.prototype={
-
-
-
-
-write:function(chunk)
-{
-this._buffer+=chunk;
-var lastIndex=this._buffer.length;
-var buffer=this._buffer;
-for(var index=this._index;index<lastIndex;++index){
-var character=buffer[index];
-if(character==="\""){
-this._closingDoubleQuoteRegex.lastIndex=index;
-if(!this._closingDoubleQuoteRegex.test(buffer))
-break;
-index=this._closingDoubleQuoteRegex.lastIndex-1;
-}else if(character==="{"){
-++this._balance;
-}else if(character==="}"){
---this._balance;
-if(this._balance<0){
-this._reportBalanced();
-return false;
-}
-if(!this._balance){
-this._lastBalancedIndex=index+1;
-if(!this._findMultiple)
-break;
-}
-}else if(character==="]"&&!this._balance){
-this._reportBalanced();
-return false;
-}
-}
-this._index=index;
-this._reportBalanced();
-return true;
-},
-
-_reportBalanced:function()
-{
-if(!this._lastBalancedIndex)
-return;
-this._callback(this._buffer.slice(0,this._lastBalancedIndex));
-this._buffer=this._buffer.slice(this._lastBalancedIndex);
-this._index-=this._lastBalancedIndex;
-this._lastBalancedIndex=0;
-},
-
-
-
-
-remainder:function()
-{
-return this._buffer;
-}};
-
-
-
-
-
-WebInspector.TokenizerFactory=function(){};
-
-WebInspector.TokenizerFactory.prototype={
-
-
-
-
-createTokenizer:function(mimeType){}};
-
-
-},{}],105:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.UIString=function(string,vararg)
-{
-return String.vsprintf(WebInspector.localize(string),Array.prototype.slice.call(arguments,1));
-};
-
-
-
-
-
-
-WebInspector.UIString.capitalize=function(string,vararg)
-{
-if(WebInspector._useLowerCaseMenuTitles===undefined)
-throw"WebInspector.setLocalizationPlatform() has not been called";
-
-var localized=WebInspector.localize(string);
-var capitalized;
-if(WebInspector._useLowerCaseMenuTitles)
-capitalized=localized.replace(/\^(.)/g,"$1");else
-
-capitalized=localized.replace(/\^(.)/g,function(str,char){return char.toUpperCase();});
-return String.vsprintf(capitalized,Array.prototype.slice.call(arguments,1));
-};
-
-
-
-
-WebInspector.setLocalizationPlatform=function(platform)
-{
-WebInspector._useLowerCaseMenuTitles=platform==="windows";
-};
-
-
-
-
-
-WebInspector.localize=function(string)
-{
-return string;
-};
-
-
-
-
-
-WebInspector.UIStringFormat=function(format)
-{
-
-this._localizedFormat=WebInspector.localize(format);
-
-this._tokenizedFormat=String.tokenizeFormatString(this._localizedFormat,String.standardFormatters);
-};
-
-
-
-
-
-
-WebInspector.UIStringFormat._append=function(a,b)
-{
-return a+b;
-};
-
-WebInspector.UIStringFormat.prototype={
-
-
-
-
-format:function(vararg)
-{
-return String.format(this._localizedFormat,arguments,
-String.standardFormatters,"",WebInspector.UIStringFormat._append,this._tokenizedFormat).formattedResult;
-}};
-
-
-},{}],106:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-console=console;
-console.__originalAssert=console.assert;
-console.assert=function(value,message)
-{
-if(value)
-return;
-console.__originalAssert(value,message);
-};
-
-
-var ArrayLike;
-
-
-
-
-
-
-function mod(m,n)
-{
-return(m%n+n)%n;
-}
-
-
-
-
-
-String.prototype.findAll=function(string)
-{
-var matches=[];
-var i=this.indexOf(string);
-while(i!==-1){
-matches.push(i);
-i=this.indexOf(string,i+string.length);
-}
-return matches;
-};
-
-
-
-
-String.prototype.replaceControlCharacters=function()
-{
-
-
-return this.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u0080-\u009f]/g,"�");
-};
-
-
-
-
-String.prototype.isWhitespace=function()
-{
-return /^\s*$/.test(this);
-};
-
-
-
-
-String.prototype.computeLineEndings=function()
-{
-var endings=this.findAll("\n");
-endings.push(this.length);
-return endings;
-};
-
-
-
-
-
-String.prototype.escapeCharacters=function(chars)
-{
-var foundChar=false;
-for(var i=0;i<chars.length;++i){
-if(this.indexOf(chars.charAt(i))!==-1){
-foundChar=true;
-break;
-}
-}
-
-if(!foundChar)
-return String(this);
-
-var result="";
-for(var i=0;i<this.length;++i){
-if(chars.indexOf(this.charAt(i))!==-1)
-result+="\\";
-result+=this.charAt(i);
-}
-
-return result;
-};
-
-
-
-
-String.regexSpecialCharacters=function()
-{
-return"^[]{}()\\.^$*+?|-,";
-};
-
-
-
-
-String.prototype.escapeForRegExp=function()
-{
-return this.escapeCharacters(String.regexSpecialCharacters());
-};
-
-
-
-
-String.prototype.escapeHTML=function()
-{
-return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");
-};
-
-
-
-
-String.prototype.unescapeHTML=function()
-{
-return this.replace(/&lt;/g,"<").
-replace(/&gt;/g,">").
-replace(/&#58;/g,":").
-replace(/&quot;/g,"\"").
-replace(/&#60;/g,"<").
-replace(/&#62;/g,">").
-replace(/&amp;/g,"&");
-};
-
-
-
-
-String.prototype.collapseWhitespace=function()
-{
-return this.replace(/[\s\xA0]+/g," ");
-};
-
-
-
-
-
-String.prototype.trimMiddle=function(maxLength)
-{
-if(this.length<=maxLength)
-return String(this);
-var leftHalf=maxLength>>1;
-var rightHalf=maxLength-leftHalf-1;
-return this.substr(0,leftHalf)+"\u2026"+this.substr(this.length-rightHalf,rightHalf);
-};
-
-
-
-
-
-String.prototype.trimEnd=function(maxLength)
-{
-if(this.length<=maxLength)
-return String(this);
-return this.substr(0,maxLength-1)+"\u2026";
-};
-
-
-
-
-
-String.prototype.trimURL=function(baseURLDomain)
-{
-var result=this.replace(/^(https|http|file):\/\//i,"");
-if(baseURLDomain){
-if(result.toLowerCase().startsWith(baseURLDomain.toLowerCase()))
-result=result.substr(baseURLDomain.length);
-}
-return result;
-};
-
-
-
-
-String.prototype.toTitleCase=function()
-{
-return this.substring(0,1).toUpperCase()+this.substring(1);
-};
-
-
-
-
-
-String.prototype.compareTo=function(other)
-{
-if(this>other)
-return 1;
-if(this<other)
-return-1;
-return 0;
-};
-
-
-
-
-String.prototype.removeURLFragment=function()
-{
-var fragmentIndex=this.indexOf("#");
-if(fragmentIndex===-1)
-fragmentIndex=this.length;
-return this.substring(0,fragmentIndex);
-};
-
-
-
-
-
-String.hashCode=function(string)
-{
-if(!string)
-return 0;
-
-
-
-var p=(1<<30)*4-5;
-var z=0x5033d967;
-var z2=0x59d2f15d;
-var s=0;
-var zi=1;
-for(var i=0;i<string.length;i++){
-var xi=string.charCodeAt(i)*z2;
-s=(s+zi*xi)%p;
-zi=zi*z%p;
-}
-s=(s+zi*(p-1))%p;
-return Math.abs(s|0);
-};
-
-
-
-
-
-
-String.isDigitAt=function(string,index)
-{
-var c=string.charCodeAt(index);
-return 48<=c&&c<=57;
-};
-
-
-
-
-String.prototype.toBase64=function()
-{
-
-
-
-
-function encodeBits(b)
-{
-return b<26?b+65:b<52?b+71:b<62?b-4:b===62?43:b===63?47:65;
-}
-var encoder=new TextEncoder();
-var data=encoder.encode(this.toString());
-var n=data.length;
-var encoded="";
-if(n===0)
-return encoded;
-var shift;
-var v=0;
-for(var i=0;i<n;i++){
-shift=i%3;
-v|=data[i]<<(16>>>shift&24);
-if(shift===2){
-encoded+=String.fromCharCode(encodeBits(v>>>18&63),encodeBits(v>>>12&63),encodeBits(v>>>6&63),encodeBits(v&63));
-v=0;
-}
-}
-if(shift===0)
-encoded+=String.fromCharCode(encodeBits(v>>>18&63),encodeBits(v>>>12&63),61,61);else
-if(shift===1)
-encoded+=String.fromCharCode(encodeBits(v>>>18&63),encodeBits(v>>>12&63),encodeBits(v>>>6&63),61);
-return encoded;
-};
-
-
-
-
-
-
-String.naturalOrderComparator=function(a,b)
-{
-var chunk=/^\d+|^\D+/;
-var chunka,chunkb,anum,bnum;
-while(1){
-if(a){
-if(!b)
-return 1;
-}else{
-if(b)
-return-1;else
-
-return 0;
-}
-chunka=a.match(chunk)[0];
-chunkb=b.match(chunk)[0];
-anum=!isNaN(chunka);
-bnum=!isNaN(chunkb);
-if(anum&&!bnum)
-return-1;
-if(bnum&&!anum)
-return 1;
-if(anum&&bnum){
-var diff=chunka-chunkb;
-if(diff)
-return diff;
-if(chunka.length!==chunkb.length){
-if(!+chunka&&!+chunkb)
-return chunka.length-chunkb.length;else
-
-return chunkb.length-chunka.length;
-}
-}else if(chunka!==chunkb)
-return chunka<chunkb?-1:1;
-a=a.substring(chunka.length);
-b=b.substring(chunkb.length);
-}
-};
-
-
-
-
-
-
-String.caseInsensetiveComparator=function(a,b)
-{
-a=a.toUpperCase();
-b=b.toUpperCase();
-if(a===b)
-return 0;
-return a>b?1:-1;
-};
-
-
-
-
-
-
-
-Number.constrain=function(num,min,max)
-{
-if(num<min)
-num=min;else
-if(num>max)
-num=max;
-return num;
-};
-
-
-
-
-
-
-Number.gcd=function(a,b)
-{
-if(b===0)
-return a;else
-
-return Number.gcd(b,a%b);
-};
-
-
-
-
-
-Number.toFixedIfFloating=function(value)
-{
-if(!value||isNaN(value))
-return value;
-var number=Number(value);
-return number%1?number.toFixed(3):String(number);
-};
-
-
-
-
-Date.prototype.toISO8601Compact=function()
-{
-
-
-
-
-function leadZero(x)
-{
-return(x>9?"":"0")+x;
-}
-return this.getFullYear()+
-leadZero(this.getMonth()+1)+
-leadZero(this.getDate())+"T"+
-leadZero(this.getHours())+
-leadZero(this.getMinutes())+
-leadZero(this.getSeconds());
-};
-
-
-
-
-Date.prototype.toConsoleTime=function()
-{
-
-
-
-
-function leadZero2(x)
-{
-return(x>9?"":"0")+x;
-}
-
-
-
-
-
-function leadZero3(x)
-{
-return"0".repeat(3-x.toString().length)+x;
-}
-
-return this.getFullYear()+"-"+
-leadZero2(this.getMonth()+1)+"-"+
-leadZero2(this.getDate())+" "+
-leadZero2(this.getHours())+":"+
-leadZero2(this.getMinutes())+":"+
-leadZero2(this.getSeconds())+"."+
-leadZero3(this.getMilliseconds());
-};
-
-Object.defineProperty(Array.prototype,"remove",{
-
-
-
-
-
-
-
-value:function(value,firstOnly)
-{
-var index=this.indexOf(value);
-if(index===-1)
-return false;
-if(firstOnly){
-this.splice(index,1);
-return true;
-}
-for(var i=index+1,n=this.length;i<n;++i){
-if(this[i]!==value)
-this[index++]=this[i];
-}
-this.length=index;
-return true;
-}});
-
-
-Object.defineProperty(Array.prototype,"pushAll",{
-
-
-
-
-
-value:function(array)
-{
-Array.prototype.push.apply(this,array);
-}});
-
-
-Object.defineProperty(Array.prototype,"rotate",{
-
-
-
-
-
-
-value:function(index)
-{
-var result=[];
-for(var i=index;i<index+this.length;++i)
-result.push(this[i%this.length]);
-return result;
-}});
-
-
-Object.defineProperty(Array.prototype,"sortNumbers",{
-
-
-
-value:function()
-{
-
-
-
-
-
-function numericComparator(a,b)
-{
-return a-b;
-}
-
-this.sort(numericComparator);
-}});
-
-
-Object.defineProperty(Uint32Array.prototype,"sort",{
-value:Array.prototype.sort});
-
-
-(function(){
-var partition={
-
-
-
-
-
-
-
-value:function(comparator,left,right,pivotIndex)
-{
-function swap(array,i1,i2)
-{
-var temp=array[i1];
-array[i1]=array[i2];
-array[i2]=temp;
-}
-
-var pivotValue=this[pivotIndex];
-swap(this,right,pivotIndex);
-var storeIndex=left;
-for(var i=left;i<right;++i){
-if(comparator(this[i],pivotValue)<0){
-swap(this,storeIndex,i);
-++storeIndex;
-}
-}
-swap(this,right,storeIndex);
-return storeIndex;
-}};
-
-Object.defineProperty(Array.prototype,"partition",partition);
-Object.defineProperty(Uint32Array.prototype,"partition",partition);
-
-var sortRange={
-
-
-
-
-
-
-
-
-
-value:function(comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight)
-{
-function quickSortRange(array,comparator,left,right,sortWindowLeft,sortWindowRight)
-{
-if(right<=left)
-return;
-var pivotIndex=Math.floor(Math.random()*(right-left))+left;
-var pivotNewIndex=array.partition(comparator,left,right,pivotIndex);
-if(sortWindowLeft<pivotNewIndex)
-quickSortRange(array,comparator,left,pivotNewIndex-1,sortWindowLeft,sortWindowRight);
-if(pivotNewIndex<sortWindowRight)
-quickSortRange(array,comparator,pivotNewIndex+1,right,sortWindowLeft,sortWindowRight);
-}
-if(leftBound===0&&rightBound===this.length-1&&sortWindowLeft===0&&sortWindowRight>=rightBound)
-this.sort(comparator);else
-
-quickSortRange(this,comparator,leftBound,rightBound,sortWindowLeft,sortWindowRight);
-return this;
-}};
-
-Object.defineProperty(Array.prototype,"sortRange",sortRange);
-Object.defineProperty(Uint32Array.prototype,"sortRange",sortRange);
-})();
-
-Object.defineProperty(Array.prototype,"stableSort",{
-
-
-
-
-
-
-value:function(comparator)
-{
-function defaultComparator(a,b)
-{
-return a<b?-1:a>b?1:0;
-}
-comparator=comparator||defaultComparator;
-
-var indices=new Array(this.length);
-for(var i=0;i<this.length;++i)
-indices[i]=i;
-var self=this;
-
-
-
-
-
-function indexComparator(a,b)
-{
-var result=comparator(self[a],self[b]);
-return result?result:a-b;
-}
-indices.sort(indexComparator);
-
-for(var i=0;i<this.length;++i){
-if(indices[i]<0||i===indices[i])
-continue;
-var cyclical=i;
-var saved=this[i];
-while(true){
-var next=indices[cyclical];
-indices[cyclical]=-1;
-if(next===i){
-this[cyclical]=saved;
-break;
-}else{
-this[cyclical]=this[next];
-cyclical=next;
-}
-}
-}
-return this;
-}});
-
-
-Object.defineProperty(Array.prototype,"qselect",{
-
-
-
-
-
-
-value:function(k,comparator)
-{
-if(k<0||k>=this.length)
-return;
-if(!comparator)
-comparator=function(a,b){return a-b;};
-
-var low=0;
-var high=this.length-1;
-for(;;){
-var pivotPosition=this.partition(comparator,low,high,Math.floor((high+low)/2));
-if(pivotPosition===k)
-return this[k];else
-if(pivotPosition>k)
-high=pivotPosition-1;else
-
-low=pivotPosition+1;
-}
-}});
-
-
-Object.defineProperty(Array.prototype,"lowerBound",{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-value:function(object,comparator,left,right)
-{
-function defaultComparator(a,b)
-{
-return a<b?-1:a>b?1:0;
-}
-comparator=comparator||defaultComparator;
-var l=left||0;
-var r=right!==undefined?right:this.length;
-while(l<r){
-var m=l+r>>1;
-if(comparator(object,this[m])>0)
-l=m+1;else
-
-r=m;
-}
-return r;
-}});
-
-
-Object.defineProperty(Array.prototype,"upperBound",{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-value:function(object,comparator,left,right)
-{
-function defaultComparator(a,b)
-{
-return a<b?-1:a>b?1:0;
-}
-comparator=comparator||defaultComparator;
-var l=left||0;
-var r=right!==undefined?right:this.length;
-while(l<r){
-var m=l+r>>1;
-if(comparator(object,this[m])>=0)
-l=m+1;else
-
-r=m;
-}
-return r;
-}});
-
-
-Object.defineProperty(Uint32Array.prototype,"lowerBound",{
-value:Array.prototype.lowerBound});
-
-
-Object.defineProperty(Uint32Array.prototype,"upperBound",{
-value:Array.prototype.upperBound});
-
-
-Object.defineProperty(Float64Array.prototype,"lowerBound",{
-value:Array.prototype.lowerBound});
-
-
-Object.defineProperty(Array.prototype,"binaryIndexOf",{
-
-
-
-
-
-
-
-value:function(value,comparator)
-{
-var index=this.lowerBound(value,comparator);
-return index<this.length&&comparator(value,this[index])===0?index:-1;
-}});
-
-
-Object.defineProperty(Array.prototype,"select",{
-
-
-
-
-
-
-value:function(field)
-{
-var result=new Array(this.length);
-for(var i=0;i<this.length;++i)
-result[i]=this[i][field];
-return result;
-}});
-
-
-Object.defineProperty(Array.prototype,"peekLast",{
-
-
-
-
-
-value:function()
-{
-return this[this.length-1];
-}});
-
-
-(function(){
-
-
-
-
-
-
-
-
-function mergeOrIntersect(array1,array2,comparator,mergeNotIntersect)
-{
-var result=[];
-var i=0;
-var j=0;
-while(i<array1.length&&j<array2.length){
-var compareValue=comparator(array1[i],array2[j]);
-if(mergeNotIntersect||!compareValue)
-result.push(compareValue<=0?array1[i]:array2[j]);
-if(compareValue<=0)
-i++;
-if(compareValue>=0)
-j++;
-}
-if(mergeNotIntersect){
-while(i<array1.length)
-result.push(array1[i++]);
-while(j<array2.length)
-result.push(array2[j++]);
-}
-return result;
-}
-
-Object.defineProperty(Array.prototype,"intersectOrdered",{
-
-
-
-
-
-
-
-value:function(array,comparator)
-{
-return mergeOrIntersect(this,array,comparator,false);
-}});
-
-
-Object.defineProperty(Array.prototype,"mergeOrdered",{
-
-
-
-
-
-
-
-value:function(array,comparator)
-{
-return mergeOrIntersect(this,array,comparator,true);
-}});
-
-})();
-
-
-
-
-
-
-String.sprintf=function(format,var_arg)
-{
-return String.vsprintf(format,Array.prototype.slice.call(arguments,1));
-};
-
-
-
-
-
-
-String.tokenizeFormatString=function(format,formatters)
-{
-var tokens=[];
-var substitutionIndex=0;
-
-function addStringToken(str)
-{
-if(tokens.length&&tokens[tokens.length-1].type==="string")
-tokens[tokens.length-1].value+=str;else
-
-tokens.push({type:"string",value:str});
-}
-
-function addSpecifierToken(specifier,precision,substitutionIndex)
-{
-tokens.push({type:"specifier",specifier:specifier,precision:precision,substitutionIndex:substitutionIndex});
-}
-
-var index=0;
-for(var precentIndex=format.indexOf("%",index);precentIndex!==-1;precentIndex=format.indexOf("%",index)){
-if(format.length===index)
-break;
-addStringToken(format.substring(index,precentIndex));
-index=precentIndex+1;
-
-if(format[index]==="%"){
-
-addStringToken("%");
-++index;
-continue;
-}
-
-if(String.isDigitAt(format,index)){
-
-var number=parseInt(format.substring(index),10);
-while(String.isDigitAt(format,index))
-++index;
-
-
-
-if(number>0&&format[index]==="$"){
-substitutionIndex=number-1;
-++index;
-}
-}
-
-var precision=-1;
-if(format[index]==="."){
-
-
-++index;
-precision=parseInt(format.substring(index),10);
-if(isNaN(precision))
-precision=0;
-
-while(String.isDigitAt(format,index))
-++index;
-}
-
-if(!(format[index]in formatters)){
-addStringToken(format.substring(precentIndex,index+1));
-++index;
-continue;
-}
-
-addSpecifierToken(format[index],precision,substitutionIndex);
-
-++substitutionIndex;
-++index;
-}
-
-addStringToken(format.substring(index));
-
-return tokens;
-};
-
-String.standardFormatters={
-
-
-
-d:function(substitution)
-{
-return!isNaN(substitution)?substitution:0;
-},
-
-
-
-
-f:function(substitution,token)
-{
-if(substitution&&token.precision>-1)
-substitution=substitution.toFixed(token.precision);
-return!isNaN(substitution)?substitution:token.precision>-1?Number(0).toFixed(token.precision):0;
-},
-
-
-
-
-s:function(substitution)
-{
-return substitution;
-}};
-
-
-
-
-
-
-
-String.vsprintf=function(format,substitutions)
-{
-return String.format(format,substitutions,String.standardFormatters,"",function(a,b){return a+b;}).formattedResult;
-};
-
-
-
-
-
-
-
-
-
-
-
-String.format=function(format,substitutions,formatters,initialValue,append,tokenizedFormat)
-{
-if(!format||!substitutions||!substitutions.length)
-return{formattedResult:append(initialValue,format),unusedSubstitutions:substitutions};
-
-function prettyFunctionName()
-{
-return"String.format(\""+format+"\", \""+Array.prototype.join.call(substitutions,"\", \"")+"\")";
-}
-
-function warn(msg)
-{
-console.warn(prettyFunctionName()+": "+msg);
-}
-
-function error(msg)
-{
-console.error(prettyFunctionName()+": "+msg);
-}
-
-var result=initialValue;
-var tokens=tokenizedFormat||String.tokenizeFormatString(format,formatters);
-var usedSubstitutionIndexes={};
-
-for(var i=0;i<tokens.length;++i){
-var token=tokens[i];
-
-if(token.type==="string"){
-result=append(result,token.value);
-continue;
-}
-
-if(token.type!=="specifier"){
-error("Unknown token type \""+token.type+"\" found.");
-continue;
-}
-
-if(token.substitutionIndex>=substitutions.length){
-
-
-error("not enough substitution arguments. Had "+substitutions.length+" but needed "+(token.substitutionIndex+1)+", so substitution was skipped.");
-result=append(result,"%"+(token.precision>-1?token.precision:"")+token.specifier);
-continue;
-}
-
-usedSubstitutionIndexes[token.substitutionIndex]=true;
-
-if(!(token.specifier in formatters)){
-
-warn("unsupported format character \u201C"+token.specifier+"\u201D. Treating as a string.");
-result=append(result,substitutions[token.substitutionIndex]);
-continue;
-}
-
-result=append(result,formatters[token.specifier](substitutions[token.substitutionIndex],token));
-}
-
-var unusedSubstitutions=[];
-for(var i=0;i<substitutions.length;++i){
-if(i in usedSubstitutionIndexes)
-continue;
-unusedSubstitutions.push(substitutions[i]);
-}
-
-return{formattedResult:result,unusedSubstitutions:unusedSubstitutions};
-};
-
-
-
-
-
-
-
-function createSearchRegex(query,caseSensitive,isRegex)
-{
-var regexFlags=caseSensitive?"g":"gi";
-var regexObject;
-
-if(isRegex){
-try{
-regexObject=new RegExp(query,regexFlags);
-}catch(e){
-
-}
-}
-
-if(!regexObject)
-regexObject=createPlainTextSearchRegex(query,regexFlags);
-
-return regexObject;
-}
-
-
-
-
-
-
-function createPlainTextSearchRegex(query,flags)
-{
-
-var regexSpecialCharacters=String.regexSpecialCharacters();
-var regex="";
-for(var i=0;i<query.length;++i){
-var c=query.charAt(i);
-if(regexSpecialCharacters.indexOf(c)!==-1)
-regex+="\\";
-regex+=c;
-}
-return new RegExp(regex,flags||"");
-}
-
-
-
-
-
-
-function countRegexMatches(regex,content)
-{
-var text=content;
-var result=0;
-var match;
-while(text&&(match=regex.exec(text))){
-if(match[0].length>0)
-++result;
-text=text.substring(match.index+1);
-}
-return result;
-}
-
-
-
-
-
-function spacesPadding(spacesCount)
-{
-return"\u00a0".repeat(spacesCount);
-}
-
-
-
-
-
-
-function numberToStringWithSpacesPadding(value,symbolsCount)
-{
-var numberString=value.toString();
-var paddingLength=Math.max(0,symbolsCount-numberString.length);
-return spacesPadding(paddingLength)+numberString;
-}
-
-
-
-
-
-Set.prototype.valuesArray=function()
-{
-return Array.from(this.values());
-};
-
-
-
-
-
-Set.prototype.addAll=function(iterable)
-{
-for(var e of iterable)
-this.add(e);
-};
-
-
-
-
-
-
-Set.prototype.containsAll=function(iterable)
-{
-for(var e of iterable){
-if(!this.has(e))
-return false;
-}
-return true;
-};
-
-
-
-
-
-Map.prototype.remove=function(key)
-{
-var value=this.get(key);
-this.delete(key);
-return value;
-};
-
-
-
-
-Map.prototype.valuesArray=function()
-{
-return Array.from(this.values());
-};
-
-
-
-
-Map.prototype.keysArray=function()
-{
-return Array.from(this.keys());
-};
-
-
-
-
-Map.prototype.inverse=function()
-{
-var result=new Multimap();
-for(var key of this.keys()){
-var value=this.get(key);
-result.set(value,key);
-}
-return result;
-};
-
-
-
-
-
-var Multimap=function()
-{
-
-this._map=new Map();
-};
-
-Multimap.prototype={
-
-
-
-
-set:function(key,value)
-{
-var set=this._map.get(key);
-if(!set){
-set=new Set();
-this._map.set(key,set);
-}
-set.add(value);
-},
-
-
-
-
-
-get:function(key)
-{
-var result=this._map.get(key);
-if(!result)
-result=new Set();
-return result;
-},
-
-
-
-
-
-has:function(key)
-{
-return this._map.has(key);
-},
-
-
-
-
-
-
-hasValue:function(key,value)
-{
-var set=this._map.get(key);
-if(!set)
-return false;
-return set.has(value);
-},
-
-
-
-
-get size()
-{
-return this._map.size;
-},
-
-
-
-
-
-remove:function(key,value)
-{
-var values=this.get(key);
-values.delete(value);
-if(!values.size)
-this._map.delete(key);
-},
-
-
-
-
-removeAll:function(key)
-{
-this._map.delete(key);
-},
-
-
-
-
-keysArray:function()
-{
-return this._map.keysArray();
-},
-
-
-
-
-valuesArray:function()
-{
-var result=[];
-var keys=this.keysArray();
-for(var i=0;i<keys.length;++i)
-result.pushAll(this.get(keys[i]).valuesArray());
-return result;
-},
-
-clear:function()
-{
-this._map.clear();
-}};
-
-
-
-
-
-
-function loadXHR(url)
-{
-return new Promise(load);
-
-function load(successCallback,failureCallback)
-{
-function onReadyStateChanged()
-{
-if(xhr.readyState!==XMLHttpRequest.DONE)
-return;
-if(xhr.status!==200){
-xhr.onreadystatechange=null;
-failureCallback(new Error(xhr.status));
-return;
-}
-xhr.onreadystatechange=null;
-successCallback(xhr.responseText);
-}
-
-var xhr=new XMLHttpRequest();
-xhr.withCredentials=false;
-xhr.open("GET",url,true);
-xhr.onreadystatechange=onReadyStateChanged;
-xhr.send(null);
-}
-}
-
-
-
-
-function CallbackBarrier()
-{
-this._pendingIncomingCallbacksCount=0;
-}
-
-CallbackBarrier.prototype={
-
-
-
-
-createCallback:function(userCallback)
-{
-console.assert(!this._outgoingCallback,"CallbackBarrier.createCallback() is called after CallbackBarrier.callWhenDone()");
-++this._pendingIncomingCallbacksCount;
-return this._incomingCallback.bind(this,userCallback);
-},
-
-
-
-
-callWhenDone:function(callback)
-{
-console.assert(!this._outgoingCallback,"CallbackBarrier.callWhenDone() is called multiple times");
-this._outgoingCallback=callback;
-if(!this._pendingIncomingCallbacksCount)
-this._outgoingCallback();
-},
-
-
-
-
-donePromise:function()
-{
-return new Promise(promiseConstructor.bind(this));
-
-
-
-
-
-function promiseConstructor(success)
-{
-this.callWhenDone(success);
-}
-},
-
-
-
-
-_incomingCallback:function(userCallback)
-{
-console.assert(this._pendingIncomingCallbacksCount>0);
-if(userCallback){
-var args=Array.prototype.slice.call(arguments,1);
-userCallback.apply(null,args);
-}
-if(! --this._pendingIncomingCallbacksCount&&this._outgoingCallback)
-this._outgoingCallback();
-}};
-
-
-
-
-
-function suppressUnused(value)
-{
-}
-
-
-
-
-
-self.setImmediate=function(callback)
-{
-Promise.resolve().then(callback);
-return 0;
-};
-
-
-
-
-
-
-Promise.prototype.spread=function(callback)
-{
-return this.then(spreadPromise);
-
-function spreadPromise(arg)
-{
-return callback.apply(null,arg);
-}
-};
-
-
-
-
-
-
-Promise.prototype.catchException=function(defaultValue){
-return this.catch(function(error){
-console.error(error);
-return defaultValue;
-});
-};
-
-
-
-
-
-
-
-Map.prototype.diff=function(other,isEqual)
-{
-var leftKeys=this.keysArray();
-var rightKeys=other.keysArray();
-leftKeys.sort((a,b)=>a-b);
-rightKeys.sort((a,b)=>a-b);
-
-var removed=[];
-var added=[];
-var equal=[];
-var leftIndex=0;
-var rightIndex=0;
-while(leftIndex<leftKeys.length&&rightIndex<rightKeys.length){
-var leftKey=leftKeys[leftIndex];
-var rightKey=rightKeys[rightIndex];
-if(leftKey===rightKey&&isEqual(this.get(leftKey),other.get(rightKey))){
-equal.push(this.get(leftKey));
-++leftIndex;
-++rightIndex;
-continue;
-}
-if(leftKey<=rightKey){
-removed.push(this.get(leftKey));
-++leftIndex;
-continue;
-}
-added.push(other.get(rightKey));
-++rightIndex;
-}
-while(leftIndex<leftKeys.length){
-var leftKey=leftKeys[leftIndex++];
-removed.push(this.get(leftKey));
-}
-while(rightIndex<rightKeys.length){
-var rightKey=rightKeys[rightIndex++];
-added.push(other.get(rightKey));
-}
-return{
-added:added,
-removed:removed,
-equal:equal};
-
-};
-
-},{}],107:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.CSSMatchedStyles=function(cssModel,node,inlinePayload,attributesPayload,matchedPayload,pseudoPayload,inheritedPayload,animationsPayload)
-{
-this._cssModel=cssModel;
-this._node=node;
-this._nodeStyles=[];
-this._nodeForStyle=new Map();
-this._inheritedStyles=new Set();
-this._keyframes=[];
-
-this._matchingSelectors=new Map();
-
-
-
-
-function addAttributesStyle()
-{
-if(!attributesPayload)
-return;
-var style=new WebInspector.CSSStyleDeclaration(cssModel,null,attributesPayload,WebInspector.CSSStyleDeclaration.Type.Attributes);
-this._nodeForStyle.set(style,this._node);
-this._nodeStyles.push(style);
-}
-
-
-if(inlinePayload&&this._node.nodeType()===Node.ELEMENT_NODE){
-var style=new WebInspector.CSSStyleDeclaration(cssModel,null,inlinePayload,WebInspector.CSSStyleDeclaration.Type.Inline);
-this._nodeForStyle.set(style,this._node);
-this._nodeStyles.push(style);
-}
-
-
-var addedAttributesStyle;
-for(var i=matchedPayload.length-1;i>=0;--i){
-var rule=new WebInspector.CSSStyleRule(cssModel,matchedPayload[i].rule);
-if((rule.isInjected()||rule.isUserAgent())&&!addedAttributesStyle){
-
-addedAttributesStyle=true;
-addAttributesStyle.call(this);
-}
-this._nodeForStyle.set(rule.style,this._node);
-this._nodeStyles.push(rule.style);
-addMatchingSelectors.call(this,this._node,rule,matchedPayload[i].matchingSelectors);
-}
-
-if(!addedAttributesStyle)
-addAttributesStyle.call(this);
-
-
-var parentNode=this._node.parentNode;
-for(var i=0;parentNode&&inheritedPayload&&i<inheritedPayload.length;++i){
-var entryPayload=inheritedPayload[i];
-var inheritedInlineStyle=entryPayload.inlineStyle?new WebInspector.CSSStyleDeclaration(cssModel,null,entryPayload.inlineStyle,WebInspector.CSSStyleDeclaration.Type.Inline):null;
-if(inheritedInlineStyle&&this._containsInherited(inheritedInlineStyle)){
-this._nodeForStyle.set(inheritedInlineStyle,parentNode);
-this._nodeStyles.push(inheritedInlineStyle);
-this._inheritedStyles.add(inheritedInlineStyle);
-}
-
-var inheritedMatchedCSSRules=entryPayload.matchedCSSRules||[];
-for(var j=inheritedMatchedCSSRules.length-1;j>=0;--j){
-var inheritedRule=new WebInspector.CSSStyleRule(cssModel,inheritedMatchedCSSRules[j].rule);
-addMatchingSelectors.call(this,parentNode,inheritedRule,inheritedMatchedCSSRules[j].matchingSelectors);
-if(!this._containsInherited(inheritedRule.style))
-continue;
-this._nodeForStyle.set(inheritedRule.style,parentNode);
-this._nodeStyles.push(inheritedRule.style);
-this._inheritedStyles.add(inheritedRule.style);
-}
-parentNode=parentNode.parentNode;
-}
-
-
-this._pseudoStyles=new Map();
-if(pseudoPayload){
-for(var i=0;i<pseudoPayload.length;++i){
-var entryPayload=pseudoPayload[i];
-
-var pseudoElement=this._node.pseudoElements().get(entryPayload.pseudoType)||null;
-var pseudoStyles=[];
-var rules=entryPayload.matches||[];
-for(var j=rules.length-1;j>=0;--j){
-var pseudoRule=new WebInspector.CSSStyleRule(cssModel,rules[j].rule);
-pseudoStyles.push(pseudoRule.style);
-this._nodeForStyle.set(pseudoRule.style,pseudoElement);
-if(pseudoElement)
-addMatchingSelectors.call(this,pseudoElement,pseudoRule,rules[j].matchingSelectors);
-}
-this._pseudoStyles.set(entryPayload.pseudoType,pseudoStyles);
-}
-}
-
-if(animationsPayload)
-this._keyframes=animationsPayload.map(rule=>new WebInspector.CSSKeyframesRule(cssModel,rule));
-
-this.resetActiveProperties();
-
-
-
-
-
-
-
-function addMatchingSelectors(node,rule,matchingSelectorIndices)
-{
-for(var matchingSelectorIndex of matchingSelectorIndices){
-var selector=rule.selectors[matchingSelectorIndex];
-this._setSelectorMatches(node,selector.text,true);
-}
-}
-};
-
-WebInspector.CSSMatchedStyles.prototype={
-
-
-
-node:function()
-{
-return this._node;
-},
-
-
-
-
-cssModel:function()
-{
-return this._cssModel;
-},
-
-
-
-
-
-hasMatchingSelectors:function(rule)
-{
-var matchingSelectors=this.matchingSelectors(rule);
-return matchingSelectors.length>0&&this.mediaMatches(rule.style);
-},
-
-
-
-
-
-matchingSelectors:function(rule)
-{
-var node=this.nodeForStyle(rule.style);
-if(!node)
-return[];
-var map=this._matchingSelectors.get(node.id);
-if(!map)
-return[];
-var result=[];
-for(var i=0;i<rule.selectors.length;++i){
-if(map.get(rule.selectors[i].text))
-result.push(i);
-}
-return result;
-},
-
-
-
-
-
-recomputeMatchingSelectors:function(rule)
-{
-var node=this.nodeForStyle(rule.style);
-if(!node)
-return Promise.resolve();
-var promises=[];
-for(var selector of rule.selectors)
-promises.push(querySelector.call(this,node,selector.text));
-return Promise.all(promises);
-
-
-
-
-
-
-
-function querySelector(node,selectorText)
-{
-var ownerDocument=node.ownerDocument||null;
-
-
-var map=this._matchingSelectors.get(node.id);
-if(map&&map.has(selectorText)||!ownerDocument)
-return Promise.resolve();
-
-var resolve;
-var promise=new Promise(fulfill=>resolve=fulfill);
-this._node.domModel().querySelectorAll(ownerDocument.id,selectorText,onQueryComplete.bind(this,node,selectorText,resolve));
-return promise;
-}
-
-
-
-
-
-
-
-
-function onQueryComplete(node,selectorText,callback,matchingNodeIds)
-{
-if(matchingNodeIds)
-this._setSelectorMatches(node,selectorText,matchingNodeIds.indexOf(node.id)!==-1);
-callback();
-}
-},
-
-
-
-
-
-
-addNewRule:function(rule,node)
-{
-this._nodeForStyle.set(rule.style,node);
-return this.recomputeMatchingSelectors(rule);
-},
-
-
-
-
-
-
-_setSelectorMatches:function(node,selectorText,value)
-{
-var map=this._matchingSelectors.get(node.id);
-if(!map){
-map=new Map();
-this._matchingSelectors.set(node.id,map);
-}
-map.set(selectorText,value);
-},
-
-
-
-
-
-mediaMatches:function(style)
-{
-var media=style.parentRule?style.parentRule.media:[];
-for(var i=0;media&&i<media.length;++i){
-if(!media[i].active())
-return false;
-}
-return true;
-},
-
-
-
-
-nodeStyles:function()
-{
-return this._nodeStyles;
-},
-
-
-
-
-keyframes:function()
-{
-return this._keyframes;
-},
-
-
-
-
-pseudoStyles:function()
-{
-return this._pseudoStyles;
-},
-
-
-
-
-
-_containsInherited:function(style)
-{
-var properties=style.allProperties;
-for(var i=0;i<properties.length;++i){
-var property=properties[i];
-
-if(property.activeInStyle()&&WebInspector.cssMetadata().isPropertyInherited(property.name))
-return true;
-}
-return false;
-},
-
-
-
-
-
-nodeForStyle:function(style)
-{
-return this._nodeForStyle.get(style)||null;
-},
-
-
-
-
-
-isInherited:function(style)
-{
-return this._inheritedStyles.has(style);
-},
-
-
-
-
-
-propertyState:function(property)
-{
-if(this._propertiesState.size===0){
-this._computeActiveProperties(this._nodeStyles,this._propertiesState);
-for(var pseudoElementStyles of this._pseudoStyles.valuesArray())
-this._computeActiveProperties(pseudoElementStyles,this._propertiesState);
-}
-return this._propertiesState.get(property)||null;
-},
-
-resetActiveProperties:function()
-{
-
-this._propertiesState=new Map();
-},
-
-
-
-
-
-_computeActiveProperties:function(styles,result)
-{
-
-var foundImportantProperties=new Set();
-
-var propertyToEffectiveRule=new Map();
-
-var inheritedPropertyToNode=new Map();
-
-var allUsedProperties=new Set();
-for(var i=0;i<styles.length;++i){
-var style=styles[i];
-var rule=style.parentRule;
-
-if(rule&&!(rule instanceof WebInspector.CSSStyleRule))
-continue;
-if(rule&&!this.hasMatchingSelectors(rule))
-continue;
-
-
-var styleActiveProperties=new Map();
-var allProperties=style.allProperties;
-for(var j=0;j<allProperties.length;++j){
-var property=allProperties[j];
-
-
-var inherited=this.isInherited(style);
-if(inherited&&!WebInspector.cssMetadata().isPropertyInherited(property.name))
-continue;
-
-if(!property.activeInStyle()){
-result.set(property,WebInspector.CSSMatchedStyles.PropertyState.Overloaded);
-continue;
-}
-
-var canonicalName=WebInspector.cssMetadata().canonicalPropertyName(property.name);
-if(foundImportantProperties.has(canonicalName)){
-result.set(property,WebInspector.CSSMatchedStyles.PropertyState.Overloaded);
-continue;
-}
-
-if(!property.important&&allUsedProperties.has(canonicalName)){
-result.set(property,WebInspector.CSSMatchedStyles.PropertyState.Overloaded);
-continue;
-}
-
-var isKnownProperty=propertyToEffectiveRule.has(canonicalName);
-var inheritedFromNode=inherited?this.nodeForStyle(style):null;
-if(!isKnownProperty&&inheritedFromNode&&!inheritedPropertyToNode.has(canonicalName))
-inheritedPropertyToNode.set(canonicalName,inheritedFromNode);
-
-if(property.important){
-if(inherited&&isKnownProperty&&inheritedFromNode!==inheritedPropertyToNode.get(canonicalName)){
-result.set(property,WebInspector.CSSMatchedStyles.PropertyState.Overloaded);
-continue;
-}
-
-foundImportantProperties.add(canonicalName);
-if(isKnownProperty){
-var overloaded=propertyToEffectiveRule.get(canonicalName).get(canonicalName);
-result.set(overloaded,WebInspector.CSSMatchedStyles.PropertyState.Overloaded);
-propertyToEffectiveRule.get(canonicalName).delete(canonicalName);
-}
-}
-
-styleActiveProperties.set(canonicalName,property);
-allUsedProperties.add(canonicalName);
-propertyToEffectiveRule.set(canonicalName,styleActiveProperties);
-result.set(property,WebInspector.CSSMatchedStyles.PropertyState.Active);
-}
-
-
-for(var property of style.leadingProperties()){
-var canonicalName=WebInspector.cssMetadata().canonicalPropertyName(property.name);
-if(!styleActiveProperties.has(canonicalName))
-continue;
-var longhands=style.longhandProperties(property.name);
-if(!longhands.length)
-continue;
-var notUsed=true;
-for(var longhand of longhands){
-var longhandCanonicalName=WebInspector.cssMetadata().canonicalPropertyName(longhand.name);
-notUsed=notUsed&&!styleActiveProperties.has(longhandCanonicalName);
-}
-if(!notUsed)
-continue;
-styleActiveProperties.delete(canonicalName);
-allUsedProperties.delete(canonicalName);
-result.set(property,WebInspector.CSSMatchedStyles.PropertyState.Overloaded);
-}
-}
-}};
-
-
-
-WebInspector.CSSMatchedStyles.PropertyState={
-Active:"Active",
-Overloaded:"Overloaded"};
-
-
-},{}],108:[function(require,module,exports){
-
-
-
-
-
-
-
-
-WebInspector.CSSMediaQuery=function(payload)
-{
-this._active=payload.active;
-this._expressions=[];
-for(var j=0;j<payload.expressions.length;++j)
-this._expressions.push(WebInspector.CSSMediaQueryExpression.parsePayload(payload.expressions[j]));
-};
-
-
-
-
-
-WebInspector.CSSMediaQuery.parsePayload=function(payload)
-{
-return new WebInspector.CSSMediaQuery(payload);
-};
-
-WebInspector.CSSMediaQuery.prototype={
-
-
-
-active:function()
-{
-return this._active;
-},
-
-
-
-
-expressions:function()
-{
-return this._expressions;
-}};
-
-
-
-
-
-
-WebInspector.CSSMediaQueryExpression=function(payload)
-{
-this._value=payload.value;
-this._unit=payload.unit;
-this._feature=payload.feature;
-this._valueRange=payload.valueRange?WebInspector.TextRange.fromObject(payload.valueRange):null;
-this._computedLength=payload.computedLength||null;
-};
-
-
-
-
-
-WebInspector.CSSMediaQueryExpression.parsePayload=function(payload)
-{
-return new WebInspector.CSSMediaQueryExpression(payload);
-};
-
-WebInspector.CSSMediaQueryExpression.prototype={
-
-
-
-value:function()
-{
-return this._value;
-},
-
-
-
-
-unit:function()
-{
-return this._unit;
-},
-
-
-
-
-feature:function()
-{
-return this._feature;
-},
-
-
-
-
-valueRange:function()
-{
-return this._valueRange;
-},
-
-
-
-
-computedLength:function()
-{
-return this._computedLength;
-}};
-
-
-
-
-
-
-
-
-WebInspector.CSSMedia=function(cssModel,payload)
-{
-this._cssModel=cssModel;
-this._reinitialize(payload);
-};
-
-WebInspector.CSSMedia.Source={
-LINKED_SHEET:"linkedSheet",
-INLINE_SHEET:"inlineSheet",
-MEDIA_RULE:"mediaRule",
-IMPORT_RULE:"importRule"};
-
-
-
-
-
-
-
-WebInspector.CSSMedia.parsePayload=function(cssModel,payload)
-{
-return new WebInspector.CSSMedia(cssModel,payload);
-};
-
-
-
-
-
-
-WebInspector.CSSMedia.parseMediaArrayPayload=function(cssModel,payload)
-{
-var result=[];
-for(var i=0;i<payload.length;++i)
-result.push(WebInspector.CSSMedia.parsePayload(cssModel,payload[i]));
-return result;
-};
-
-WebInspector.CSSMedia.prototype={
-
-
-
-_reinitialize:function(payload)
-{
-this.text=payload.text;
-this.source=payload.source;
-this.sourceURL=payload.sourceURL||"";
-this.range=payload.range?WebInspector.TextRange.fromObject(payload.range):null;
-this.styleSheetId=payload.styleSheetId;
-this.mediaList=null;
-if(payload.mediaList){
-this.mediaList=[];
-for(var i=0;i<payload.mediaList.length;++i)
-this.mediaList.push(WebInspector.CSSMediaQuery.parsePayload(payload.mediaList[i]));
-}
-},
-
-
-
-
-rebase:function(edit)
-{
-if(this.styleSheetId!==edit.styleSheetId||!this.range)
-return;
-if(edit.oldRange.equal(this.range))
-this._reinitialize(edit.payload);else
-
-this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
-},
-
-
-
-
-
-equal:function(other)
-{
-if(!this.styleSheetId||!this.range||!other.range)
-return false;
-return this.styleSheetId===other.styleSheetId&&this.range.equal(other.range);
-},
-
-
-
-
-active:function()
-{
-if(!this.mediaList)
-return true;
-for(var i=0;i<this.mediaList.length;++i){
-if(this.mediaList[i].active())
-return true;
-}
-return false;
-},
-
-
-
-
-lineNumberInSource:function()
-{
-if(!this.range)
+if(typeof val!=='string'){
 return undefined;
-var header=this.header();
-if(!header)
+}
+
+if(integerRegEx.test(val)){
+return exports.TYPES.INTEGER;
+}
+if(numberRegEx.test(val)){
+return exports.TYPES.NUMBER;
+}
+if(lengthRegEx.test(val)){
+return exports.TYPES.LENGTH;
+}
+if(percentRegEx.test(val)){
+return exports.TYPES.PERCENT;
+}
+if(urlRegEx.test(val)){
+return exports.TYPES.URL;
+}
+if(stringRegEx.test(val)){
+return exports.TYPES.STRING;
+}
+if(angleRegEx.test(val)){
+return exports.TYPES.ANGLE;
+}
+if(colorRegEx1.test(val)){
+return exports.TYPES.COLOR;
+}
+var res=colorRegEx2.exec(val);
+var parts;
+if(res!==null){
+parts=res[1].split(/\s*,\s*/);
+if(parts.length!==3){
 return undefined;
-return header.lineNumberInSource(this.range.startLine);
-},
-
-
-
-
-columnNumberInSource:function()
-{
-if(!this.range)
+}
+if(parts.every(percentRegEx.test.bind(percentRegEx))||parts.every(integerRegEx.test.bind(integerRegEx))){
+return exports.TYPES.COLOR;
+}
 return undefined;
-var header=this.header();
-if(!header)
+}
+res=colorRegEx3.exec(val);
+if(res!==null){
+parts=res[1].split(/\s*,\s*/);
+if(parts.length!==4){
 return undefined;
-return header.columnNumberInSource(this.range.startLine,this.range.startColumn);
-},
-
-
-
-
-header:function()
-{
-return this.styleSheetId?this._cssModel.styleSheetHeaderForId(this.styleSheetId):null;
-},
-
-
-
-
-rawLocation:function()
-{
-var header=this.header();
-if(!header||this.lineNumberInSource()===undefined)
-return null;
-var lineNumber=Number(this.lineNumberInSource());
-return new WebInspector.CSSLocation(header,lineNumber,this.columnNumberInSource());
-}};
-
-
-},{}],109:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.CSSMetadata=function(properties)
-{
-this._values=[];
-
-this._longhands=new Map();
-
-this._shorthands=new Map();
-
-this._inherited=new Set();
-for(var i=0;i<properties.length;++i){
-var property=properties[i];
-var propertyName=property.name;
-if(!CSS.supports(propertyName,"initial"))
-continue;
-this._values.push(propertyName);
-
-if(property.inherited)
-this._inherited.add(propertyName);
-
-var longhands=properties[i].longhands;
-if(longhands){
-this._longhands.set(propertyName,longhands);
-for(var j=0;j<longhands.length;++j){
-var longhandName=longhands[j];
-var shorthands=this._shorthands.get(longhandName);
-if(!shorthands){
-shorthands=[];
-this._shorthands.set(longhandName,shorthands);
 }
-shorthands.push(propertyName);
+if(parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))||parts.every(integerRegEx.test.bind(integerRegEx))){
+if(numberRegEx.test(parts[3])){
+return exports.TYPES.COLOR;
 }
 }
-}
-this._values.sort();
-this._valuesSet=new Set(this._values);
-};
-
-WebInspector.CSSMetadata.VariableRegex=/(var\(--.*?\))/g;
-WebInspector.CSSMetadata.URLRegex=/url\(\s*('.+?'|".+?"|[^)]+)\s*\)/g;
-
-WebInspector.CSSMetadata.prototype={
-
-
-
-allProperties:function()
-{
-return this._values;
-},
-
-
-
-
-
-longhands:function(shorthand)
-{
-return this._longhands.get(shorthand)||null;
-},
-
-
-
-
-
-shorthands:function(longhand)
-{
-return this._shorthands.get(longhand)||null;
-},
-
-
-
-
-
-isColorAwareProperty:function(propertyName)
-{
-return!!WebInspector.CSSMetadata._colorAwareProperties.has(propertyName.toLowerCase())||this.isCustomProperty(propertyName.toLowerCase());
-},
-
-
-
-
-
-isLengthProperty:function(propertyName)
-{
-propertyName=propertyName.toLowerCase();
-if(propertyName==="line-height")
-return false;
-return WebInspector.CSSMetadata._distanceProperties.has(propertyName)||propertyName.startsWith("margin")||propertyName.startsWith("padding")||propertyName.indexOf("width")!==-1||propertyName.indexOf("height")!==-1;
-},
-
-
-
-
-
-isBezierAwareProperty:function(propertyName)
-{
-propertyName=propertyName.toLowerCase();
-return!!WebInspector.CSSMetadata._bezierAwareProperties.has(propertyName)||this.isCustomProperty(propertyName);
-},
-
-
-
-
-
-isCustomProperty:function(propertyName)
-{
-return propertyName.startsWith("--");
-},
-
-
-
-
-
-canonicalPropertyName:function(name)
-{
-name=name.toLowerCase();
-if(!name||name.length<9||name.charAt(0)!=="-")
-return name;
-var match=name.match(/(?:-webkit-)(.+)/);
-if(!match||!this._valuesSet.has(match[1]))
-return name;
-return match[1];
-},
-
-
-
-
-
-isCSSPropertyName:function(propertyName)
-{
-propertyName=propertyName.toLowerCase();
-if(propertyName.startsWith("-moz-")||propertyName.startsWith("-o-")||propertyName.startsWith("-webkit-")||propertyName.startsWith("-ms-"))
-return true;
-return this._valuesSet.has(propertyName);
-},
-
-
-
-
-
-isPropertyInherited:function(propertyName)
-{
-propertyName=propertyName.toLowerCase();
-return this._inherited.has(this.canonicalPropertyName(propertyName))||this._inherited.has(propertyName);
-},
-
-
-
-
-
-propertyValues:function(propertyName)
-{
-var acceptedKeywords=["inherit","initial"];
-propertyName=propertyName.toLowerCase();
-var unprefixedName=propertyName.replace(/^-webkit-/,"");
-var entry=WebInspector.CSSMetadata._propertyDataMap[propertyName]||WebInspector.CSSMetadata._propertyDataMap[unprefixedName];
-if(entry&&entry.values)
-acceptedKeywords.pushAll(entry.values);
-if(this.isColorAwareProperty(propertyName)){
-acceptedKeywords.push("currentColor");
-for(var color in WebInspector.Color.Nicknames)
-acceptedKeywords.push(color);
-}
-return acceptedKeywords.sort();
-},
-
-
-
-
-
-mostUsedProperty:function(properties)
-{
-var maxWeight=0;
-var index=0;
-for(var i=0;i<properties.length;i++){
-var weight=WebInspector.CSSMetadata.Weight[properties[i]];
-if(!weight)
-weight=WebInspector.CSSMetadata.Weight[this.canonicalPropertyName(properties[i])];
-if(weight>maxWeight){
-maxWeight=weight;
-index=i;
-}
-}
-return index;
-}};
-
-
-
-
-
-WebInspector.cssMetadata=function()
-{
-if(!WebInspector.CSSMetadata._instance)
-WebInspector.CSSMetadata._instance=new WebInspector.CSSMetadata(WebInspector.CSSMetadata._generatedProperties||[]);
-return WebInspector.CSSMetadata._instance;
-};
-
-WebInspector.CSSMetadata._distanceProperties=new Set([
-"background-position","border-spacing","bottom","font-size","height","left","letter-spacing","max-height","max-width","min-height",
-"min-width","right","text-indent","top","width","word-spacing"]);
-
-
-WebInspector.CSSMetadata._bezierAwareProperties=new Set([
-"animation","animation-timing-function","transition","transition-timing-function","-webkit-animation","-webkit-animation-timing-function",
-"-webkit-transition","-webkit-transition-timing-function"]);
-
-
-WebInspector.CSSMetadata._colorAwareProperties=new Set([
-"backdrop-filter","background","background-color","background-image","border","border-color","border-image",
-"border-image-source","border-bottom","border-bottom-color","border-left","border-left-color","border-right",
-"border-right-color","border-top","border-top-color","box-shadow","color","column-rule","column-rule-color","fill",
-"list-style","list-style-image","outline","outline-color","stroke","text-decoration-color","text-shadow",
-"-webkit-border-after","-webkit-border-after-color","-webkit-border-before","-webkit-border-before-color","-webkit-border-end",
-"-webkit-border-end-color","-webkit-border-start","-webkit-border-start-color","-webkit-box-reflect","-webkit-box-shadow",
-"-webkit-column-rule-color","-webkit-filter","-webkit-mask","-webkit-mask-box-image","-webkit-mask-box-image-source",
-"-webkit-mask-image","-webkit-tap-highlight-color","-webkit-text-decoration-color","-webkit-text-emphasis",
-"-webkit-text-emphasis-color","-webkit-text-fill-color","-webkit-text-stroke","-webkit-text-stroke-color"]);
-
-
-WebInspector.CSSMetadata._propertyDataMap={
-"table-layout":{values:[
-"auto","fixed"]},
-
-"visibility":{values:[
-"hidden","visible","collapse"]},
-
-"background-repeat":{values:[
-"repeat","repeat-x","repeat-y","no-repeat","space","round"]},
-
-"content":{values:[
-"list-item","close-quote","no-close-quote","no-open-quote","open-quote"]},
-
-"list-style-image":{values:[
-"none"]},
-
-"clear":{values:[
-"none","left","right","both"]},
-
-"overflow-x":{values:[
-"hidden","auto","visible","overlay","scroll"]},
-
-"stroke-linejoin":{values:[
-"round","miter","bevel"]},
-
-"baseline-shift":{values:[
-"baseline","sub","super"]},
-
-"border-bottom-width":{values:[
-"medium","thick","thin"]},
-
-"margin-top-collapse":{values:[
-"collapse","separate","discard"]},
-
-"max-height":{values:[
-"none"]},
-
-"box-orient":{values:[
-"horizontal","vertical","inline-axis","block-axis"]},
-
-"font-stretch":{values:[
-"normal","wider","narrower","ultra-condensed","extra-condensed","condensed","semi-condensed",
-"semi-expanded","expanded","extra-expanded","ultra-expanded"]},
-
-"border-left-width":{values:[
-"medium","thick","thin"]},
-
-"box-shadow":{values:[
-"inset","none"]},
-
-"writing-mode":{values:[
-"horizontal-tb","vertical-rl","vertical-lr"]},
-
-"-webkit-writing-mode":{values:[
-"lr","rl","tb","lr-tb","rl-tb","tb-rl","horizontal-tb","vertical-rl","vertical-lr"]},
-
-"border-collapse":{values:[
-"collapse","separate"]},
-
-"page-break-inside":{values:[
-"auto","avoid"]},
-
-"border-top-width":{values:[
-"medium","thick","thin"]},
-
-"outline-color":{values:[
-"invert"]},
-
-"outline-style":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"cursor":{values:[
-"none","copy","auto","crosshair","default","pointer","move","vertical-text","cell","context-menu",
-"alias","progress","no-drop","not-allowed","-webkit-zoom-in","-webkit-zoom-out","e-resize","ne-resize",
-"nw-resize","n-resize","se-resize","sw-resize","s-resize","w-resize","ew-resize","ns-resize",
-"nesw-resize","nwse-resize","col-resize","row-resize","text","wait","help","all-scroll","-webkit-grab",
-"-webkit-grabbing"]},
-
-"border-width":{values:[
-"medium","thick","thin"]},
-
-"border-style":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"size":{values:[
-"a3","a4","a5","b4","b5","landscape","ledger","legal","letter","portrait"]},
-
-"background-size":{values:[
-"contain","cover"]},
-
-"direction":{values:[
-"ltr","rtl"]},
-
-"enable-background":{values:[
-"accumulate","new"]},
-
-"float":{values:[
-"none","left","right"]},
-
-"overflow-y":{values:[
-"hidden","auto","visible","overlay","scroll"]},
-
-"margin-bottom-collapse":{values:[
-"collapse","separate","discard"]},
-
-"box-reflect":{values:[
-"left","right","above","below"]},
-
-"overflow":{values:[
-"hidden","auto","visible","overlay","scroll"]},
-
-"contain":{values:[
-"none","strict","content","size","layout","style","paint"]},
-
-"text-rendering":{values:[
-"auto","optimizeSpeed","optimizeLegibility","geometricPrecision"]},
-
-"text-align":{values:[
-"-webkit-auto","start","end","left","right","center","justify","-webkit-left","-webkit-right","-webkit-center"]},
-
-"list-style-position":{values:[
-"outside","inside","hanging"]},
-
-"margin-bottom":{values:[
-"auto"]},
-
-"color-interpolation":{values:[
-"linearrgb"]},
-
-"background-origin":{values:[
-"border-box","content-box","padding-box"]},
-
-"word-wrap":{values:[
-"normal","break-word"]},
-
-"font-weight":{values:[
-"normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900"]},
-
-"margin-before-collapse":{values:[
-"collapse","separate","discard"]},
-
-"text-transform":{values:[
-"none","capitalize","uppercase","lowercase"]},
-
-"border-right-style":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"border-left-style":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"-webkit-text-emphasis":{values:[
-"circle","filled","open","dot","double-circle","triangle","sesame"]},
-
-"font-style":{values:[
-"italic","oblique","normal"]},
-
-"speak":{values:[
-"none","normal","spell-out","digits","literal-punctuation","no-punctuation"]},
-
-"color-rendering":{values:[
-"auto","optimizeSpeed","optimizeQuality"]},
-
-"list-style-type":{values:[
-"none","inline","disc","circle","square","decimal","decimal-leading-zero","arabic-indic","binary","bengali",
-"cambodian","khmer","devanagari","gujarati","gurmukhi","kannada","lower-hexadecimal","lao","malayalam",
-"mongolian","myanmar","octal","oriya","persian","urdu","telugu","tibetan","thai","upper-hexadecimal",
-"lower-roman","upper-roman","lower-greek","lower-alpha","lower-latin","upper-alpha","upper-latin","afar",
-"ethiopic-halehame-aa-et","ethiopic-halehame-aa-er","amharic","ethiopic-halehame-am-et","amharic-abegede",
-"ethiopic-abegede-am-et","cjk-earthly-branch","cjk-heavenly-stem","ethiopic","ethiopic-halehame-gez",
-"ethiopic-abegede","ethiopic-abegede-gez","hangul-consonant","hangul","lower-norwegian","oromo",
-"ethiopic-halehame-om-et","sidama","ethiopic-halehame-sid-et","somali","ethiopic-halehame-so-et","tigre",
-"ethiopic-halehame-tig","tigrinya-er","ethiopic-halehame-ti-er","tigrinya-er-abegede",
-"ethiopic-abegede-ti-er","tigrinya-et","ethiopic-halehame-ti-et","tigrinya-et-abegede",
-"ethiopic-abegede-ti-et","upper-greek","upper-norwegian","asterisks","footnotes","hebrew","armenian",
-"lower-armenian","upper-armenian","georgian","cjk-ideographic","hiragana","katakana","hiragana-iroha",
-"katakana-iroha"]},
-
-"text-combine-upright":{values:[
-"none","all"]},
-
-"-webkit-text-combine":{values:[
-"none","horizontal"]},
-
-"text-orientation":{values:[
-"mixed","upright","sideways"]},
-
-"outline":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"font":{values:[
-"caption","icon","menu","message-box","small-caption","-webkit-mini-control","-webkit-small-control",
-"-webkit-control","status-bar","italic","oblique","small-caps","normal","bold","bolder","lighter",
-"100","200","300","400","500","600","700","800","900","xx-small","x-small","small","medium",
-"large","x-large","xx-large","-webkit-xxx-large","smaller","larger","serif","sans-serif","cursive",
-"fantasy","monospace","-webkit-body","-webkit-pictograph"]},
-
-"dominant-baseline":{values:[
-"middle","auto","central","text-before-edge","text-after-edge","ideographic","alphabetic","hanging",
-"mathematical","use-script","no-change","reset-size"]},
-
-"display":{values:[
-"none","inline","block","list-item","run-in","inline-block","table","inline-table",
-"table-row-group","table-header-group","table-footer-group","table-row","table-column-group",
-"table-column","table-cell","table-caption","-webkit-box","-webkit-inline-box",
-"flex","inline-flex","grid","inline-grid"]},
-
-"-webkit-text-emphasis-position":{values:[
-"over","under"]},
-
-"image-rendering":{values:[
-"auto","optimizeSpeed","optimizeQuality","pixelated"]},
-
-"alignment-baseline":{values:[
-"baseline","middle","auto","before-edge","after-edge","central","text-before-edge","text-after-edge",
-"ideographic","alphabetic","hanging","mathematical"]},
-
-"outline-width":{values:[
-"medium","thick","thin"]},
-
-"box-align":{values:[
-"baseline","center","stretch","start","end"]},
-
-"border-right-width":{values:[
-"medium","thick","thin"]},
-
-"border-top-style":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"line-height":{values:[
-"normal"]},
-
-"text-overflow":{values:[
-"clip","ellipsis"]},
-
-"overflow-wrap":{values:[
-"normal","break-word"]},
-
-"box-direction":{values:[
-"normal","reverse"]},
-
-"margin-after-collapse":{values:[
-"collapse","separate","discard"]},
-
-"page-break-before":{values:[
-"left","right","auto","always","avoid"]},
-
-"border-image":{values:[
-"repeat","stretch"]},
-
-"text-decoration":{values:[
-"none","blink","line-through","overline","underline"]},
-
-"position":{values:[
-"absolute","fixed","relative","static"]},
-
-"font-family":{values:[
-"serif","sans-serif","cursive","fantasy","monospace","-webkit-body","-webkit-pictograph"]},
-
-"text-overflow-mode":{values:[
-"clip","ellipsis"]},
-
-"border-bottom-style":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"unicode-bidi":{values:[
-"normal","bidi-override","embed","isolate","isolate-override","plaintext"]},
-
-"clip-rule":{values:[
-"nonzero","evenodd"]},
-
-"margin-left":{values:[
-"auto"]},
-
-"margin-top":{values:[
-"auto"]},
-
-"zoom":{values:[
-"normal","document","reset"]},
-
-"max-width":{values:[
-"none"]},
-
-"caption-side":{values:[
-"top","bottom"]},
-
-"empty-cells":{values:[
-"hide","show"]},
-
-"pointer-events":{values:[
-"none","all","auto","visible","visiblepainted","visiblefill","visiblestroke","painted","fill","stroke","bounding-box"]},
-
-"letter-spacing":{values:[
-"normal"]},
-
-"background-clip":{values:[
-"border-box","content-box","padding-box"]},
-
-"-webkit-font-smoothing":{values:[
-"none","auto","antialiased","subpixel-antialiased"]},
-
-"border":{values:[
-"none","hidden","inset","groove","ridge","outset","dotted","dashed","solid","double"]},
-
-"font-size":{values:[
-"xx-small","x-small","small","medium","large","x-large","xx-large","-webkit-xxx-large","smaller",
-"larger"]},
-
-"font-variant":{values:[
-"small-caps","normal"]},
-
-"vertical-align":{values:[
-"baseline","middle","sub","super","text-top","text-bottom","top","bottom","-webkit-baseline-middle"]},
-
-"white-space":{values:[
-"normal","nowrap","pre","pre-line","pre-wrap"]},
-
-"box-lines":{values:[
-"single","multiple"]},
-
-"page-break-after":{values:[
-"left","right","auto","always","avoid"]},
-
-"clip-path":{values:[
-"none"]},
-
-"margin":{values:[
-"auto"]},
-
-"margin-right":{values:[
-"auto"]},
-
-"word-break":{values:[
-"normal","break-all","break-word"]},
-
-"word-spacing":{values:[
-"normal"]},
-
-"-webkit-text-emphasis-style":{values:[
-"circle","filled","open","dot","double-circle","triangle","sesame"]},
-
-"transform":{values:[
-"scale","scaleX","scaleY","scale3d","rotate","rotateX","rotateY","rotateZ","rotate3d","skew","skewX","skewY",
-"translate","translateX","translateY","translateZ","translate3d","matrix","matrix3d","perspective"]},
-
-"image-resolution":{values:[
-"from-image","snap"]},
-
-"box-sizing":{values:[
-"content-box","border-box"]},
-
-"clip":{values:[
-"auto"]},
-
-"resize":{values:[
-"none","both","horizontal","vertical"]},
-
-"align-content":{values:[
-"flex-start","flex-end","center","space-between","space-around","stretch"]},
-
-"align-items":{values:[
-"flex-start","flex-end","center","baseline","stretch"]},
-
-"align-self":{values:[
-"auto","flex-start","flex-end","center","baseline","stretch"]},
-
-"flex-direction":{values:[
-"row","row-reverse","column","column-reverse"]},
-
-"justify-content":{values:[
-"flex-start","flex-end","center","space-between","space-around"]},
-
-"flex-wrap":{values:[
-"nowrap","wrap","wrap-reverse"]},
-
-"perspective":{values:[
-"none"]},
-
-"perspective-origin":{values:[
-"left","center","right","top","bottom"]},
-
-"transform-origin":{values:[
-"left","center","right","top","bottom"]},
-
-"transform-style":{values:[
-"flat","preserve-3d"]},
-
-"transition-timing-function":{values:[
-"ease","linear","ease-in","ease-out","ease-in-out","step-start","step-end","steps","cubic-bezier"]},
-
-"animation-timing-function":{values:[
-"ease","linear","ease-in","ease-out","ease-in-out","step-start","step-end","steps","cubic-bezier"]},
-
-"animation-direction":{values:[
-"normal","reverse","alternate","alternate-reverse"]},
-
-"animation-play-state":{values:[
-"running","paused"]},
-
-"animation-fill-mode":{values:[
-"none","forwards","backwards","both"]},
-
-"-webkit-backface-visibility":{values:[
-"visible","hidden"]},
-
-"-webkit-box-decoration-break":{values:[
-"slice","clone"]},
-
-"-webkit-column-break-after":{values:[
-"auto","always","avoid","left","right","page","column","avoid-page","avoid-column"]},
-
-"-webkit-column-break-before":{values:[
-"auto","always","avoid","left","right","page","column","avoid-page","avoid-column"]},
-
-"-webkit-column-break-inside":{values:[
-"auto","avoid","avoid-page","avoid-column"]},
-
-"-webkit-column-span":{values:[
-"none","all"]},
-
-"-webkit-column-count":{values:[
-"auto"]},
-
-"-webkit-column-gap":{values:[
-"normal"]},
-
-"-webkit-filter":{values:[
-"url","blur","brightness","contrast","drop-shadow","grayscale","hue-rotate","invert","opacity","saturate","sepia"]},
-
-"-webkit-line-break":{values:[
-"auto","loose","normal","strict"]},
-
-"-webkit-user-select":{values:[
-"none","text","all"]},
-
-"-webkit-user-modify":{values:[
-"read-only","read-write","read-write-plaintext-only"]},
-
-"text-align-last":{values:[
-"auto","start","end","left","right","center","justify"]},
-
-"-webkit-text-decoration-line":{values:[
-"none","underline","overline","line-through","blink"]},
-
-"-webkit-text-decoration-style":{values:[
-"solid","double","dotted","dashed","wavy"]},
-
-"-webkit-text-decoration-skip":{values:[
-"none","objects","spaces","ink","edges","box-decoration"]},
-
-"mix-blend-mode":{values:[
-"normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light",
-"difference","exclusion","hue","saturation","color","luminosity","unset"]},
-
-"background-blend-mode":{values:[
-"normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light",
-"difference","exclusion","hue","saturation","color","luminosity","unset"]}};
-
-
-
-
-WebInspector.CSSMetadata.Weight={
-"align-content":57,
-"align-items":129,
-"align-self":55,
-"animation":175,
-"animation-delay":114,
-"animation-direction":113,
-"animation-duration":137,
-"animation-fill-mode":132,
-"animation-iteration-count":124,
-"animation-name":139,
-"animation-play-state":104,
-"animation-timing-function":141,
-"backface-visibility":123,
-"background":260,
-"background-attachment":119,
-"background-clip":165,
-"background-color":259,
-"background-image":246,
-"background-origin":107,
-"background-position":237,
-"background-position-x":108,
-"background-position-y":93,
-"background-repeat":234,
-"background-size":203,
-"border":263,
-"border-bottom":233,
-"border-bottom-color":190,
-"border-bottom-left-radius":186,
-"border-bottom-right-radius":185,
-"border-bottom-style":150,
-"border-bottom-width":179,
-"border-collapse":209,
-"border-color":226,
-"border-image":89,
-"border-image-outset":50,
-"border-image-repeat":49,
-"border-image-slice":58,
-"border-image-source":32,
-"border-image-width":52,
-"border-left":221,
-"border-left-color":174,
-"border-left-style":142,
-"border-left-width":172,
-"border-radius":224,
-"border-right":223,
-"border-right-color":182,
-"border-right-style":130,
-"border-right-width":178,
-"border-spacing":198,
-"border-style":206,
-"border-top":231,
-"border-top-color":192,
-"border-top-left-radius":187,
-"border-top-right-radius":189,
-"border-top-style":152,
-"border-top-width":180,
-"border-width":214,
-"bottom":227,
-"box-shadow":213,
-"box-sizing":216,
-"caption-side":96,
-"clear":229,
-"clip":173,
-"clip-rule":5,
-"color":256,
-"content":219,
-"counter-increment":111,
-"counter-reset":110,
-"cursor":250,
-"direction":176,
-"display":262,
-"empty-cells":99,
-"fill":140,
-"fill-opacity":82,
-"fill-rule":22,
-"filter":160,
-"flex":133,
-"flex-basis":66,
-"flex-direction":85,
-"flex-flow":94,
-"flex-grow":112,
-"flex-shrink":61,
-"flex-wrap":68,
-"float":252,
-"font":211,
-"font-family":254,
-"font-kerning":18,
-"font-size":264,
-"font-stretch":77,
-"font-style":220,
-"font-variant":161,
-"font-weight":257,
-"height":266,
-"image-rendering":90,
-"justify-content":127,
-"left":248,
-"letter-spacing":188,
-"line-height":244,
-"list-style":215,
-"list-style-image":145,
-"list-style-position":149,
-"list-style-type":199,
-"margin":267,
-"margin-bottom":241,
-"margin-left":243,
-"margin-right":238,
-"margin-top":253,
-"mask":20,
-"max-height":205,
-"max-width":225,
-"min-height":217,
-"min-width":218,
-"object-fit":33,
-"opacity":251,
-"order":117,
-"orphans":146,
-"outline":222,
-"outline-color":153,
-"outline-offset":147,
-"outline-style":151,
-"outline-width":148,
-"overflow":255,
-"overflow-wrap":105,
-"overflow-x":184,
-"overflow-y":196,
-"padding":265,
-"padding-bottom":230,
-"padding-left":235,
-"padding-right":232,
-"padding-top":240,
-"page":8,
-"page-break-after":120,
-"page-break-before":69,
-"page-break-inside":121,
-"perspective":92,
-"perspective-origin":103,
-"pointer-events":183,
-"position":261,
-"quotes":158,
-"resize":168,
-"right":245,
-"shape-rendering":38,
-"size":64,
-"speak":118,
-"src":170,
-"stop-color":42,
-"stop-opacity":31,
-"stroke":98,
-"stroke-dasharray":36,
-"stroke-dashoffset":3,
-"stroke-linecap":30,
-"stroke-linejoin":21,
-"stroke-miterlimit":12,
-"stroke-opacity":34,
-"stroke-width":87,
-"table-layout":171,
-"tab-size":46,
-"text-align":260,
-"text-anchor":35,
-"text-decoration":247,
-"text-indent":207,
-"text-overflow":204,
-"text-rendering":155,
-"text-shadow":208,
-"text-transform":202,
-"top":258,
-"touch-action":80,
-"transform":181,
-"transform-origin":162,
-"transform-style":86,
-"transition":193,
-"transition-delay":134,
-"transition-duration":135,
-"transition-property":131,
-"transition-timing-function":122,
-"unicode-bidi":156,
-"unicode-range":136,
-"vertical-align":236,
-"visibility":242,
-"-webkit-appearance":191,
-"-webkit-backface-visibility":154,
-"-webkit-background-clip":164,
-"-webkit-background-origin":40,
-"-webkit-background-size":163,
-"-webkit-border-end":9,
-"-webkit-border-horizontal-spacing":81,
-"-webkit-border-image":75,
-"-webkit-border-radius":212,
-"-webkit-border-start":10,
-"-webkit-border-start-color":16,
-"-webkit-border-start-width":13,
-"-webkit-border-vertical-spacing":43,
-"-webkit-box-align":101,
-"-webkit-box-direction":51,
-"-webkit-box-flex":128,
-"-webkit-box-lines":2,
-"-webkit-box-ordinal-group":91,
-"-webkit-box-orient":144,
-"-webkit-box-pack":106,
-"-webkit-box-reflect":39,
-"-webkit-box-shadow":210,
-"-webkit-column-break-inside":60,
-"-webkit-column-count":84,
-"-webkit-column-gap":76,
-"-webkit-column-rule":25,
-"-webkit-column-rule-color":23,
-"-webkit-columns":44,
-"-webkit-column-span":29,
-"-webkit-column-width":47,
-"-webkit-filter":159,
-"-webkit-font-feature-settings":59,
-"-webkit-font-smoothing":177,
-"-webkit-highlight":1,
-"-webkit-line-break":45,
-"-webkit-line-clamp":126,
-"-webkit-margin-after":67,
-"-webkit-margin-before":70,
-"-webkit-margin-collapse":14,
-"-webkit-margin-end":65,
-"-webkit-margin-start":100,
-"-webkit-margin-top-collapse":78,
-"-webkit-mask":19,
-"-webkit-mask-box-image":72,
-"-webkit-mask-image":88,
-"-webkit-mask-position":54,
-"-webkit-mask-repeat":63,
-"-webkit-mask-size":79,
-"-webkit-padding-after":15,
-"-webkit-padding-before":28,
-"-webkit-padding-end":48,
-"-webkit-padding-start":73,
-"-webkit-print-color-adjust":83,
-"-webkit-rtl-ordering":7,
-"-webkit-tap-highlight-color":169,
-"-webkit-text-emphasis-color":11,
-"-webkit-text-fill-color":71,
-"-webkit-text-security":17,
-"-webkit-text-stroke":56,
-"-webkit-text-stroke-color":37,
-"-webkit-text-stroke-width":53,
-"-webkit-user-drag":95,
-"-webkit-user-modify":62,
-"-webkit-user-select":194,
-"-webkit-writing-mode":4,
-"white-space":228,
-"widows":115,
-"width":268,
-"will-change":74,
-"word-break":166,
-"word-spacing":157,
-"word-wrap":197,
-"writing-mode":41,
-"z-index":239,
-"zoom":200};
-
-
-},{}],110:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.CSSProperty=function(ownerStyle,index,name,value,important,disabled,parsedOk,implicit,text,range)
-{
-this.ownerStyle=ownerStyle;
-this.index=index;
-this.name=name;
-this.value=value;
-this.important=important;
-this.disabled=disabled;
-this.parsedOk=parsedOk;
-this.implicit=implicit;
-this.text=text;
-this.range=range?WebInspector.TextRange.fromObject(range):null;
-this._active=true;
-this._nameRange=null;
-this._valueRange=null;
-};
-
-
-
-
-
-
-
-WebInspector.CSSProperty.parsePayload=function(ownerStyle,index,payload)
-{
-
-
-
-
-
-var result=new WebInspector.CSSProperty(
-ownerStyle,index,payload.name,payload.value,payload.important||false,payload.disabled||false,"parsedOk"in payload?!!payload.parsedOk:true,!!payload.implicit,payload.text,payload.range);
-return result;
-};
-
-WebInspector.CSSProperty.prototype={
-_ensureRanges:function()
-{
-if(this._nameRange&&this._valueRange)
-return;
-var range=this.range;
-var text=this.text?new WebInspector.Text(this.text):null;
-if(!range||!text)
-return;
-
-var nameIndex=text.value().indexOf(this.name);
-var valueIndex=text.value().lastIndexOf(this.value);
-if(nameIndex===-1||valueIndex===-1||nameIndex>valueIndex)
-return;
-
-var nameSourceRange=new WebInspector.SourceRange(nameIndex,this.name.length);
-var valueSourceRange=new WebInspector.SourceRange(valueIndex,this.value.length);
-
-this._nameRange=rebase(text.toTextRange(nameSourceRange),range.startLine,range.startColumn);
-this._valueRange=rebase(text.toTextRange(valueSourceRange),range.startLine,range.startColumn);
-
-
-
-
-
-
-
-function rebase(oneLineRange,lineOffset,columnOffset)
-{
-if(oneLineRange.startLine===0){
-oneLineRange.startColumn+=columnOffset;
-oneLineRange.endColumn+=columnOffset;
-}
-oneLineRange.startLine+=lineOffset;
-oneLineRange.endLine+=lineOffset;
-return oneLineRange;
-}
-},
-
-
-
-
-nameRange:function()
-{
-this._ensureRanges();
-return this._nameRange;
-},
-
-
-
-
-valueRange:function()
-{
-this._ensureRanges();
-return this._valueRange;
-},
-
-
-
-
-rebase:function(edit)
-{
-if(this.ownerStyle.styleSheetId!==edit.styleSheetId)
-return;
-if(this.range)
-this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
-},
-
-
-
-
-_setActive:function(active)
-{
-this._active=active;
-},
-
-get propertyText()
-{
-if(this.text!==undefined)
-return this.text;
-
-if(this.name==="")
-return"";
-return this.name+": "+this.value+(this.important?" !important":"")+";";
-},
-
-
-
-
-activeInStyle:function()
-{
-return this._active;
-},
-
-
-
-
-
-
-
-setText:function(propertyText,majorChange,overwrite)
-{
-if(!this.ownerStyle)
-return Promise.reject(new Error("No ownerStyle for property"));
-
-if(!this.ownerStyle.styleSheetId)
-return Promise.reject(new Error("No owner style id"));
-
-if(!this.range||!this.ownerStyle.range)
-return Promise.reject(new Error("Style not editable"));
-
-if(majorChange)
-WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Action.StyleRuleEdited);
-
-if(overwrite&&propertyText===this.propertyText){
-if(majorChange)
-this.ownerStyle.cssModel().domModel().markUndoableState();
-return Promise.resolve(true);
-}
-
-var range=this.range.relativeTo(this.ownerStyle.range.startLine,this.ownerStyle.range.startColumn);
-var indentation=this.ownerStyle.cssText?this._detectIndentation(this.ownerStyle.cssText):WebInspector.moduleSetting("textEditorIndent").get();
-var endIndentation=this.ownerStyle.cssText?indentation.substring(0,this.ownerStyle.range.endColumn):"";
-var text=new WebInspector.Text(this.ownerStyle.cssText||"");
-var newStyleText=text.replaceRange(range,String.sprintf(";%s;",propertyText));
-
-return self.runtime.extension(WebInspector.TokenizerFactory).instance().
-then(this._formatStyle.bind(this,newStyleText,indentation,endIndentation)).
-then(setStyleText.bind(this));
-
-
-
-
-
-
-function setStyleText(styleText)
-{
-return this.ownerStyle.setText(styleText,majorChange);
-}
-},
-
-
-
-
-
-
-
-
-_formatStyle:function(styleText,indentation,endIndentation,tokenizerFactory)
-{
-if(indentation)
-indentation="\n"+indentation;
-var result="";
-var propertyText;
-var insideProperty=false;
-var tokenize=tokenizerFactory.createTokenizer("text/css");
-
-tokenize("*{"+styleText+"}",processToken);
-if(insideProperty)
-result+=propertyText;
-result=result.substring(2,result.length-1).trimRight();
-return result+(indentation?"\n"+endIndentation:"");
-
-
-
-
-
-
-
-function processToken(token,tokenType,column,newColumn)
-{
-if(!insideProperty){
-var disabledProperty=tokenType&&tokenType.includes("css-comment")&&isDisabledProperty(token);
-var isPropertyStart=tokenType&&(tokenType.includes("css-string")||tokenType.includes("css-meta")||tokenType.includes("css-property")||tokenType.includes("css-variable-2"));
-if(disabledProperty){
-result=result.trimRight()+indentation+token;
-}else if(isPropertyStart){
-insideProperty=true;
-propertyText=token;
-}else if(token!==";"){
-result+=token;
-}
-return;
-}
-
-if(token==="}"||token===";"){
-result=result.trimRight()+indentation+propertyText.trim()+";";
-insideProperty=false;
-if(token==="}")
-result+="}";
-}else{
-propertyText+=token;
-}
-}
-
-
-
-
-
-function isDisabledProperty(text)
-{
-var colon=text.indexOf(":");
-if(colon===-1)
-return false;
-var propertyName=text.substring(2,colon).trim();
-return WebInspector.cssMetadata().isCSSPropertyName(propertyName);
-}
-},
-
-
-
-
-
-_detectIndentation:function(text)
-{
-var lines=text.split("\n");
-if(lines.length<2)
-return"";
-return WebInspector.TextUtils.lineIndent(lines[1]);
-},
-
-
-
-
-
-
-
-setValue:function(newValue,majorChange,overwrite,userCallback)
-{
-var text=this.name+": "+newValue+(this.important?" !important":"")+";";
-this.setText(text,majorChange,overwrite).then(userCallback);
-},
-
-
-
-
-
-setDisabled:function(disabled)
-{
-if(!this.ownerStyle)
-return Promise.resolve(false);
-if(disabled===this.disabled)
-return Promise.resolve(true);
-var propertyText=this.text.trim();
-var text=disabled?"/* "+propertyText+" */":this.text.substring(2,propertyText.length-2).trim();
-return this.setText(text,true,true);
-}};
-
-
-},{}],111:[function(require,module,exports){
-
-
-
-
-
-
-
-
-WebInspector.CSSValue=function(payload)
-{
-this.text=payload.text;
-if(payload.range)
-this.range=WebInspector.TextRange.fromObject(payload.range);
-};
-
-WebInspector.CSSValue.prototype={
-
-
-
-rebase:function(edit)
-{
-if(!this.range)
-return;
-this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
-}};
-
-
-
-
-
-
-
-WebInspector.CSSRule=function(cssModel,payload)
-{
-this._cssModel=cssModel;
-this.styleSheetId=payload.styleSheetId;
-
-if(this.styleSheetId){
-var styleSheetHeader=cssModel.styleSheetHeaderForId(this.styleSheetId);
-this.sourceURL=styleSheetHeader.sourceURL;
-}
-this.origin=payload.origin;
-this.style=new WebInspector.CSSStyleDeclaration(this._cssModel,this,payload.style,WebInspector.CSSStyleDeclaration.Type.Regular);
-};
-
-WebInspector.CSSRule.prototype={
-
-
-
-rebase:function(edit)
-{
-if(this.styleSheetId!==edit.styleSheetId)
-return;
-this.style.rebase(edit);
-},
-
-
-
-
-resourceURL:function()
-{
-if(!this.styleSheetId)
-return"";
-var styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);
-return styleSheetHeader.resourceURL();
-},
-
-
-
-
-isUserAgent:function()
-{
-return this.origin===CSSAgent.StyleSheetOrigin.UserAgent;
-},
-
-
-
-
-isInjected:function()
-{
-return this.origin===CSSAgent.StyleSheetOrigin.Injected;
-},
-
-
-
-
-isViaInspector:function()
-{
-return this.origin===CSSAgent.StyleSheetOrigin.Inspector;
-},
-
-
-
-
-isRegular:function()
-{
-return this.origin===CSSAgent.StyleSheetOrigin.Regular;
-}};
-
-
-
-
-
-
-
-
-WebInspector.CSSStyleRule=function(cssModel,payload)
-{
-WebInspector.CSSRule.call(this,cssModel,payload);
-
-this._reinitializeSelectors(payload.selectorList);
-this.media=payload.media?WebInspector.CSSMedia.parseMediaArrayPayload(cssModel,payload.media):[];
-};
-
-
-
-
-
-
-WebInspector.CSSStyleRule.createDummyRule=function(cssModel,selectorText)
-{
-var dummyPayload={
-selectorList:{
-selectors:[{text:selectorText}]},
-
-style:{
-styleSheetId:"0",
-range:new WebInspector.TextRange(0,0,0,0),
-shorthandEntries:[],
-cssProperties:[]}};
-
-
-return new WebInspector.CSSStyleRule(cssModel,dummyPayload);
-};
-
-WebInspector.CSSStyleRule.prototype={
-
-
-
-_reinitializeSelectors:function(selectorList)
-{
-
-this.selectors=[];
-for(var i=0;i<selectorList.selectors.length;++i)
-this.selectors.push(new WebInspector.CSSValue(selectorList.selectors[i]));
-},
-
-
-
-
-
-setSelectorText:function(newSelector)
-{
-var styleSheetId=this.styleSheetId;
-if(!styleSheetId)
-throw"No rule stylesheet id";
-var range=this.selectorRange();
-if(!range)
-throw"Rule selector is not editable";
-return this._cssModel.setSelectorText(styleSheetId,range,newSelector);
-},
-
-
-
-
-selectorText:function()
-{
-return this.selectors.select("text").join(", ");
-},
-
-
-
-
-selectorRange:function()
-{
-var firstRange=this.selectors[0].range;
-if(!firstRange)
-return null;
-var lastRange=this.selectors.peekLast().range;
-return new WebInspector.TextRange(firstRange.startLine,firstRange.startColumn,lastRange.endLine,lastRange.endColumn);
-},
-
-
-
-
-
-lineNumberInSource:function(selectorIndex)
-{
-var selector=this.selectors[selectorIndex];
-if(!selector||!selector.range||!this.styleSheetId)
-return 0;
-var styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);
-return styleSheetHeader.lineNumberInSource(selector.range.startLine);
-},
-
-
-
-
-
-columnNumberInSource:function(selectorIndex)
-{
-var selector=this.selectors[selectorIndex];
-if(!selector||!selector.range||!this.styleSheetId)
 return undefined;
-var styleSheetHeader=this._cssModel.styleSheetHeaderForId(this.styleSheetId);
-console.assert(styleSheetHeader);
-return styleSheetHeader.columnNumberInSource(selector.range.startLine,selector.range.startColumn);
-},
-
-
-
-
-
-rebase:function(edit)
-{
-if(this.styleSheetId!==edit.styleSheetId)
-return;
-if(this.selectorRange().equal(edit.oldRange)){
-this._reinitializeSelectors(edit.payload);
-}else{
-for(var i=0;i<this.selectors.length;++i)
-this.selectors[i].rebase(edit);
-}
-for(var media of this.media)
-media.rebase(edit);
-
-WebInspector.CSSRule.prototype.rebase.call(this,edit);
-},
-
-__proto__:WebInspector.CSSRule.prototype};
-
-
-
-
-
-
-
-WebInspector.CSSKeyframesRule=function(cssModel,payload)
-{
-this._cssModel=cssModel;
-this._animationName=new WebInspector.CSSValue(payload.animationName);
-this._keyframes=payload.keyframes.map(keyframeRule=>new WebInspector.CSSKeyframeRule(cssModel,keyframeRule));
-};
-
-WebInspector.CSSKeyframesRule.prototype={
-
-
-
-name:function()
-{
-return this._animationName;
-},
-
-
-
-
-keyframes:function()
-{
-return this._keyframes;
-}};
-
-
-
-
-
-
-
-
-WebInspector.CSSKeyframeRule=function(cssModel,payload)
-{
-WebInspector.CSSRule.call(this,cssModel,payload);
-this._reinitializeKey(payload.keyText);
-};
-
-WebInspector.CSSKeyframeRule.prototype={
-
-
-
-key:function()
-{
-return this._keyText;
-},
-
-
-
-
-_reinitializeKey:function(payload)
-{
-this._keyText=new WebInspector.CSSValue(payload);
-},
-
-
-
-
-
-rebase:function(edit)
-{
-if(this.styleSheetId!==edit.styleSheetId||!this._keyText.range)
-return;
-if(edit.oldRange.equal(this._keyText.range))
-this._reinitializeKey(edit.payload);else
-
-this._keyText.rebase(edit);
-
-WebInspector.CSSRule.prototype.rebase.call(this,edit);
-},
-
-
-
-
-
-setKeyText:function(newKeyText)
-{
-var styleSheetId=this.styleSheetId;
-if(!styleSheetId)
-throw"No rule stylesheet id";
-var range=this._keyText.range;
-if(!range)
-throw"Keyframe key is not editable";
-return this._cssModel.setKeyframeKey(styleSheetId,range,newKeyText);
-},
-
-__proto__:WebInspector.CSSRule.prototype};
-
-
-},{}],112:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.CSSStyleDeclaration=function(cssModel,parentRule,payload,type)
-{
-this._cssModel=cssModel;
-this.parentRule=parentRule;
-this._reinitialize(payload);
-this.type=type;
-};
-
-
-WebInspector.CSSStyleDeclaration.Type={
-Regular:"Regular",
-Inline:"Inline",
-Attributes:"Attributes"};
-
-
-WebInspector.CSSStyleDeclaration.prototype={
-
-
-
-rebase:function(edit)
-{
-if(this.styleSheetId!==edit.styleSheetId||!this.range)
-return;
-if(edit.oldRange.equal(this.range)){
-this._reinitialize(edit.payload);
-}else{
-this.range=this.range.rebaseAfterTextEdit(edit.oldRange,edit.newRange);
-for(var i=0;i<this._allProperties.length;++i)
-this._allProperties[i].rebase(edit);
-}
-},
-
-
-
-
-_reinitialize:function(payload)
-{
-this.styleSheetId=payload.styleSheetId;
-this.range=payload.range?WebInspector.TextRange.fromObject(payload.range):null;
-
-var shorthandEntries=payload.shorthandEntries;
-
-this._shorthandValues=new Map();
-
-this._shorthandIsImportant=new Set();
-for(var i=0;i<shorthandEntries.length;++i){
-this._shorthandValues.set(shorthandEntries[i].name,shorthandEntries[i].value);
-if(shorthandEntries[i].important)
-this._shorthandIsImportant.add(shorthandEntries[i].name);
-}
-
-this._allProperties=[];
-for(var i=0;i<payload.cssProperties.length;++i){
-var property=WebInspector.CSSProperty.parsePayload(this,i,payload.cssProperties[i]);
-this._allProperties.push(property);
-}
-
-this._generateSyntheticPropertiesIfNeeded();
-this._computeInactiveProperties();
-
-this._activePropertyMap=new Map();
-for(var property of this._allProperties){
-if(!property.activeInStyle())
-continue;
-this._activePropertyMap.set(property.name,property);
-}
-
-this.cssText=payload.cssText;
-this._leadingProperties=null;
-},
-
-_generateSyntheticPropertiesIfNeeded:function()
-{
-if(this.range)
-return;
-
-if(!this._shorthandValues.size)
-return;
-
-var propertiesSet=new Set();
-for(var property of this._allProperties)
-propertiesSet.add(property.name);
-
-var generatedProperties=[];
-
-for(var property of this._allProperties){
-
-var shorthands=WebInspector.cssMetadata().shorthands(property.name)||[];
-for(var shorthand of shorthands){
-if(propertiesSet.has(shorthand))
-continue;
-var shorthandValue=this._shorthandValues.get(shorthand);
-if(!shorthandValue)
-continue;
-
-
-var shorthandImportance=!!this._shorthandIsImportant.has(shorthand);
-var shorthandProperty=new WebInspector.CSSProperty(this,this.allProperties.length,shorthand,shorthandValue,shorthandImportance,false,true,false);
-generatedProperties.push(shorthandProperty);
-propertiesSet.add(shorthand);
-}
-}
-this._allProperties=this._allProperties.concat(generatedProperties);
-},
-
-
-
-
-_computeLeadingProperties:function()
-{
-
-
-
-
-function propertyHasRange(property)
-{
-return!!property.range;
-}
-
-if(this.range)
-return this._allProperties.filter(propertyHasRange);
-
-var leadingProperties=[];
-for(var property of this._allProperties){
-var shorthands=WebInspector.cssMetadata().shorthands(property.name)||[];
-var belongToAnyShorthand=false;
-for(var shorthand of shorthands){
-if(this._shorthandValues.get(shorthand)){
-belongToAnyShorthand=true;
-break;
-}
-}
-if(!belongToAnyShorthand)
-leadingProperties.push(property);
-}
-
-return leadingProperties;
-},
-
-
-
-
-leadingProperties:function()
-{
-if(!this._leadingProperties)
-this._leadingProperties=this._computeLeadingProperties();
-return this._leadingProperties;
-},
-
-
-
-
-target:function()
-{
-return this._cssModel.target();
-},
-
-
-
-
-cssModel:function()
-{
-return this._cssModel;
-},
-
-_computeInactiveProperties:function()
-{
-var activeProperties={};
-for(var i=0;i<this._allProperties.length;++i){
-var property=this._allProperties[i];
-if(property.disabled||!property.parsedOk){
-property._setActive(false);
-continue;
-}
-var canonicalName=WebInspector.cssMetadata().canonicalPropertyName(property.name);
-var activeProperty=activeProperties[canonicalName];
-if(!activeProperty){
-activeProperties[canonicalName]=property;
-}else if(!activeProperty.important||property.important){
-activeProperty._setActive(false);
-activeProperties[canonicalName]=property;
-}else{
-property._setActive(false);
-}
-}
-},
-
-get allProperties()
-{
-return this._allProperties;
-},
-
-
-
-
-
-getPropertyValue:function(name)
-{
-var property=this._activePropertyMap.get(name);
-return property?property.value:"";
-},
-
-
-
-
-
-isPropertyImplicit:function(name)
-{
-var property=this._activePropertyMap.get(name);
-return property?property.implicit:"";
-},
-
-
-
-
-
-longhandProperties:function(name)
-{
-var longhands=WebInspector.cssMetadata().longhands(name);
-var result=[];
-for(var i=0;longhands&&i<longhands.length;++i){
-var property=this._activePropertyMap.get(longhands[i]);
-if(property)
-result.push(property);
-}
-return result;
-},
-
-
-
-
-
-propertyAt:function(index)
-{
-return index<this.allProperties.length?this.allProperties[index]:null;
-},
-
-
-
-
-pastLastSourcePropertyIndex:function()
-{
-for(var i=this.allProperties.length-1;i>=0;--i){
-if(this.allProperties[i].range)
-return i+1;
-}
-return 0;
-},
-
-
-
-
-
-_insertionRange:function(index)
-{
-var property=this.propertyAt(index);
-return property&&property.range?property.range.collapseToStart():this.range.collapseToEnd();
-},
-
-
-
-
-
-newBlankProperty:function(index)
-{
-index=typeof index==="undefined"?this.pastLastSourcePropertyIndex():index;
-var property=new WebInspector.CSSProperty(this,index,"","",false,false,true,false,"",this._insertionRange(index));
-return property;
-},
-
-
-
-
-
-
-setText:function(text,majorChange)
-{
-return this._cssModel.setStyleText(this.styleSheetId,this.range,text,majorChange);
-},
-
-
-
-
-
-
-
-insertPropertyAt:function(index,name,value,userCallback)
-{
-this.newBlankProperty(index).setText(name+": "+value+";",false,true).
-then(userCallback);
-},
-
-
-
-
-
-
-appendProperty:function(name,value,userCallback)
-{
-this.insertPropertyAt(this.allProperties.length,name,value,userCallback);
-}};
-
-
-},{}],113:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.Target=function(targetManager,name,capabilitiesMask,connection,parentTarget)
-{
-Protocol.Agents.call(this,connection.agentsMap());
-this._targetManager=targetManager;
-this._name=name;
-this._inspectedURL="";
-this._capabilitiesMask=capabilitiesMask;
-this._connection=connection;
-this._parentTarget=parentTarget;
-connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected,this._onDisconnect,this);
-this._id=WebInspector.Target._nextId++;
-
-
-this._modelByConstructor=new Map();
-};
-
-
-
-
-WebInspector.Target.Capability={
-Browser:1,
-DOM:2,
-JS:4,
-Log:8,
-Network:16,
-Worker:32};
-
-
-WebInspector.Target._nextId=1;
-
-WebInspector.Target.prototype={
-
-
-
-id:function()
-{
-return this._id;
-},
-
-
-
-
-name:function()
-{
-return this._name;
-},
-
-
-
-
-targetManager:function()
-{
-return this._targetManager;
-},
-
-
-
-
-
-hasAllCapabilities:function(capabilitiesMask)
-{
-return(this._capabilitiesMask&capabilitiesMask)===capabilitiesMask;
-},
-
-
-
-
-
-connection:function()
-{
-return this._connection;
-},
-
-
-
-
-
-decorateLabel:function(label)
-{
-return!this.hasBrowserCapability()?"\u2699 "+label:label;
-},
-
-
-
-
-
-
-registerDispatcher:function(domain,dispatcher)
-{
-this._connection.registerDispatcher(domain,dispatcher);
-},
-
-
-
-
-hasBrowserCapability:function()
-{
-return this.hasAllCapabilities(WebInspector.Target.Capability.Browser);
-},
-
-
-
-
-hasJSCapability:function()
-{
-return this.hasAllCapabilities(WebInspector.Target.Capability.JS);
-},
-
-
-
-
-hasLogCapability:function()
-{
-return this.hasAllCapabilities(WebInspector.Target.Capability.Log);
-},
-
-
-
-
-hasNetworkCapability:function()
-{
-return this.hasAllCapabilities(WebInspector.Target.Capability.Network);
-},
-
-
-
-
-hasWorkerCapability:function()
-{
-return this.hasAllCapabilities(WebInspector.Target.Capability.Worker);
-},
-
-
-
-
-hasDOMCapability:function()
-{
-return this.hasAllCapabilities(WebInspector.Target.Capability.DOM);
-},
-
-
-
-
-parentTarget:function()
-{
-return this._parentTarget;
-},
-
-_onDisconnect:function()
-{
-this._targetManager.removeTarget(this);
-this._dispose();
-},
-
-_dispose:function()
-{
-this._targetManager.dispatchEventToListeners(WebInspector.TargetManager.Events.TargetDisposed,this);
-if(this.workerManager)
-this.workerManager.dispose();
-},
-
-
-
-
-isDetached:function()
-{
-return this._connection.isClosed();
-},
-
-
-
-
-
-model:function(modelClass)
-{
-return this._modelByConstructor.get(modelClass)||null;
-},
-
-
-
-
-models:function()
-{
-return this._modelByConstructor.valuesArray();
-},
-
-
-
-
-inspectedURL:function()
-{
-return this._inspectedURL;
-},
-
-
-
-
-setInspectedURL:function(inspectedURL)
-{
-this._inspectedURL=inspectedURL;
-InspectorFrontendHost.inspectedURLChanged(inspectedURL||"");
-this._targetManager.dispatchEventToListeners(WebInspector.TargetManager.Events.InspectedURLChanged,this);
-},
-
-__proto__:Protocol.Agents.prototype};
-
-
-
-
-
-
-
-WebInspector.SDKObject=function(target)
-{
-WebInspector.Object.call(this);
-this._target=target;
-};
-
-WebInspector.SDKObject.prototype={
-
-
-
-target:function()
-{
-return this._target;
-},
-
-__proto__:WebInspector.Object.prototype};
-
-
-
-
-
-
-
-
-WebInspector.SDKModel=function(modelClass,target)
-{
-WebInspector.SDKObject.call(this,target);
-target._modelByConstructor.set(modelClass,this);
-WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Events.TargetDisposed,this._targetDisposed,this);
-};
-
-WebInspector.SDKModel.prototype={
-
-
-
-suspendModel:function()
-{
-return Promise.resolve();
-},
-
-
-
-
-resumeModel:function()
-{
-return Promise.resolve();
-},
-
-dispose:function(){},
-
-
-
-
-_targetDisposed:function(event)
-{
-var target=event.data;
-if(target!==this._target)
-return;
-this.dispose();
-WebInspector.targetManager.removeEventListener(WebInspector.TargetManager.Events.TargetDisposed,this._targetDisposed,this);
-},
-
-__proto__:WebInspector.SDKObject.prototype};
-
-
-},{}],114:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-WebInspector.TargetManager=function()
-{
-WebInspector.Object.call(this);
-
-this._targets=[];
-
-this._observers=[];
-this._observerCapabiliesMaskSymbol=Symbol("observerCapabilitiesMask");
-
-this._modelListeners=new Map();
-this._isSuspended=false;
-};
-
-
-WebInspector.TargetManager.Events={
-InspectedURLChanged:Symbol("InspectedURLChanged"),
-MainFrameNavigated:Symbol("MainFrameNavigated"),
-Load:Symbol("Load"),
-PageReloadRequested:Symbol("PageReloadRequested"),
-WillReloadPage:Symbol("WillReloadPage"),
-TargetDisposed:Symbol("TargetDisposed"),
-SuspendStateChanged:Symbol("SuspendStateChanged")};
-
-
-WebInspector.TargetManager._listenersSymbol=Symbol("WebInspector.TargetManager.Listeners");
-
-WebInspector.TargetManager.prototype={
-suspendAllTargets:function()
-{
-if(this._isSuspended)
-return;
-this._isSuspended=true;
-this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);
-
-for(var i=0;i<this._targets.length;++i){
-for(var model of this._targets[i].models())
-model.suspendModel();
-}
-},
-
-
-
-
-resumeAllTargets:function()
-{
-if(!this._isSuspended)
-throw new Error("Not suspended");
-this._isSuspended=false;
-this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendStateChanged);
-
-var promises=[];
-for(var i=0;i<this._targets.length;++i){
-for(var model of this._targets[i].models())
-promises.push(model.resumeModel());
-}
-return Promise.all(promises);
-},
-
-suspendAndResumeAllTargets:function()
-{
-this.suspendAllTargets();
-this.resumeAllTargets();
-},
-
-
-
-
-allTargetsSuspended:function()
-{
-return this._isSuspended;
-},
-
-
-
-
-inspectedURL:function()
-{
-return this._targets[0]?this._targets[0].inspectedURL():"";
-},
-
-
-
-
-
-_redispatchEvent:function(eventName,event)
-{
-this.dispatchEventToListeners(eventName,event.data);
-},
-
-
-
-
-
-reloadPage:function(bypassCache,injectedScript)
-{
-if(!this._targets.length)
-return;
-
-var resourceTreeModel=WebInspector.ResourceTreeModel.fromTarget(this._targets[0]);
-if(!resourceTreeModel)
-return;
-
-resourceTreeModel.reloadPage(bypassCache,injectedScript);
-},
-
-
-
-
-
-
-
-addModelListener:function(modelClass,eventType,listener,thisObject)
-{
-for(var i=0;i<this._targets.length;++i){
-var model=this._targets[i].model(modelClass);
-if(model)
-model.addEventListener(eventType,listener,thisObject);
-}
-if(!this._modelListeners.has(eventType))
-this._modelListeners.set(eventType,[]);
-this._modelListeners.get(eventType).push({modelClass:modelClass,thisObject:thisObject,listener:listener});
-},
-
-
-
-
-
-
-
-removeModelListener:function(modelClass,eventType,listener,thisObject)
-{
-if(!this._modelListeners.has(eventType))
-return;
-
-for(var i=0;i<this._targets.length;++i){
-var model=this._targets[i].model(modelClass);
-if(model)
-model.removeEventListener(eventType,listener,thisObject);
-}
-
-var listeners=this._modelListeners.get(eventType);
-for(var i=0;i<listeners.length;++i){
-if(listeners[i].modelClass===modelClass&&listeners[i].listener===listener&&listeners[i].thisObject===thisObject)
-listeners.splice(i--,1);
-}
-if(!listeners.length)
-this._modelListeners.delete(eventType);
-},
-
-
-
-
-
-observeTargets:function(targetObserver,capabilitiesMask)
-{
-if(this._observerCapabiliesMaskSymbol in targetObserver)
-throw new Error("Observer can only be registered once");
-targetObserver[this._observerCapabiliesMaskSymbol]=capabilitiesMask||0;
-this.targets(capabilitiesMask).forEach(targetObserver.targetAdded.bind(targetObserver));
-this._observers.push(targetObserver);
-},
-
-
-
-
-unobserveTargets:function(targetObserver)
-{
-delete targetObserver[this._observerCapabiliesMaskSymbol];
-this._observers.remove(targetObserver);
-},
-
-
-
-
-
-
-
-
-createTarget:function(name,capabilitiesMask,connection,parentTarget)
-{
-var target=new WebInspector.Target(this,name,capabilitiesMask,connection,parentTarget);
-
-var logAgent=target.hasLogCapability()?target.logAgent():null;
-
-
-target.consoleModel=new WebInspector.ConsoleModel(target,logAgent);
-
-target.runtimeModel=new WebInspector.RuntimeModel(target);
-
-var networkManager=null;
-var resourceTreeModel=null;
-if(target.hasNetworkCapability())
-networkManager=new WebInspector.NetworkManager(target);
-if(networkManager&&target.hasDOMCapability()){
-resourceTreeModel=new WebInspector.ResourceTreeModel(target,networkManager,WebInspector.SecurityOriginManager.fromTarget(target));
-new WebInspector.NetworkLog(target,resourceTreeModel,networkManager);
-}
-
-if(target.hasJSCapability())
-new WebInspector.DebuggerModel(target);
-
-if(resourceTreeModel){
-var domModel=new WebInspector.DOMModel(target);
-
-new WebInspector.CSSModel(target,domModel);
 }
 
 
-target.workerManager=target.hasWorkerCapability()?new WebInspector.WorkerManager(target):null;
+val=val.toLowerCase();
+switch(val){
+case'maroon':
+case'red':
+case'orange':
+case'yellow':
+case'olive':
+case'purple':
+case'fuchsia':
+case'white':
+case'lime':
+case'green':
+case'navy':
+case'blue':
+case'aqua':
+case'teal':
+case'black':
+case'silver':
+case'gray':
 
-target.cpuProfilerModel=new WebInspector.CPUProfilerModel(target);
-
-target.heapProfilerModel=new WebInspector.HeapProfilerModel(target);
-
-target.tracingManager=new WebInspector.TracingManager(target);
-
-if(target.hasBrowserCapability()){
-target.subTargetsManager=new WebInspector.SubTargetsManager(target);
-target.serviceWorkerManager=new WebInspector.ServiceWorkerManager(target,target.subTargetsManager);
-}
-
-this.addTarget(target);
-return target;
-},
-
-
-
-
-
-_observersForTarget:function(target)
-{
-return this._observers.filter(observer=>target.hasAllCapabilities(observer[this._observerCapabiliesMaskSymbol]||0));
-},
-
-
-
-
-addTarget:function(target)
-{
-this._targets.push(target);
-var resourceTreeModel=WebInspector.ResourceTreeModel.fromTarget(target);
-if(this._targets.length===1&&resourceTreeModel){
-resourceTreeModel[WebInspector.TargetManager._listenersSymbol]=[
-setupRedispatch.call(this,WebInspector.ResourceTreeModel.Events.MainFrameNavigated,WebInspector.TargetManager.Events.MainFrameNavigated),
-setupRedispatch.call(this,WebInspector.ResourceTreeModel.Events.Load,WebInspector.TargetManager.Events.Load),
-setupRedispatch.call(this,WebInspector.ResourceTreeModel.Events.PageReloadRequested,WebInspector.TargetManager.Events.PageReloadRequested),
-setupRedispatch.call(this,WebInspector.ResourceTreeModel.Events.WillReloadPage,WebInspector.TargetManager.Events.WillReloadPage)];
-
-}
-var copy=this._observersForTarget(target);
-for(var i=0;i<copy.length;++i)
-copy[i].targetAdded(target);
-
-for(var pair of this._modelListeners){
-var listeners=pair[1];
-for(var i=0;i<listeners.length;++i){
-var model=target.model(listeners[i].modelClass);
-if(model)
-model.addEventListener(pair[0],listeners[i].listener,listeners[i].thisObject);
-}
-}
-
-
-
-
-
-
-
-function setupRedispatch(sourceEvent,targetEvent)
-{
-return resourceTreeModel.addEventListener(sourceEvent,this._redispatchEvent.bind(this,targetEvent));
-}
-},
-
-
-
-
-removeTarget:function(target)
-{
-this._targets.remove(target);
-var resourceTreeModel=WebInspector.ResourceTreeModel.fromTarget(target);
-var treeModelListeners=resourceTreeModel&&resourceTreeModel[WebInspector.TargetManager._listenersSymbol];
-if(treeModelListeners)
-WebInspector.EventTarget.removeEventListeners(treeModelListeners);
-
-var copy=this._observersForTarget(target);
-for(var i=0;i<copy.length;++i)
-copy[i].targetRemoved(target);
-
-for(var pair of this._modelListeners){
-var listeners=pair[1];
-for(var i=0;i<listeners.length;++i){
-var model=target.model(listeners[i].modelClass);
-if(model)
-model.removeEventListener(pair[0],listeners[i].listener,listeners[i].thisObject);
-}
-}
-},
-
-
-
-
-
-targets:function(capabilitiesMask)
-{
-if(!capabilitiesMask)
-return this._targets.slice();else
-
-return this._targets.filter(target=>target.hasAllCapabilities(capabilitiesMask||0));
-},
-
-
-
-
-
-
-targetById:function(id)
-{
-for(var i=0;i<this._targets.length;++i){
-if(this._targets[i].id()===id)
-return this._targets[i];
-}
-return null;
-},
-
-
-
-
-mainTarget:function()
-{
-return this._targets[0]||null;
-},
-
-
-
-
-suspendReload:function(target)
-{
-var resourceTreeModel=WebInspector.ResourceTreeModel.fromTarget(target);
-if(resourceTreeModel)
-resourceTreeModel.suspendReload();
-},
-
-
-
-
-resumeReload:function(target)
-{
-var resourceTreeModel=WebInspector.ResourceTreeModel.fromTarget(target);
-if(resourceTreeModel)
-setImmediate(resourceTreeModel.resumeReload.bind(resourceTreeModel));
-},
-
-__proto__:WebInspector.Object.prototype};
-
-
-
-
-
-WebInspector.TargetManager.Observer=function()
-{
-};
-
-WebInspector.TargetManager.Observer.prototype={
-
-
-
-targetAdded:function(target){},
-
-
-
-
-targetRemoved:function(target){}};
-
-
-
-
-
-WebInspector.targetManager=new WebInspector.TargetManager();
-
-},{}],115:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-WebInspector.TimelineLoader=function(model,delegate)
-{
-this._model=model;
-this._delegate=delegate;
-
-
-this._canceledCallback=null;
-
-this._state=WebInspector.TimelineLoader.State.Initial;
-this._buffer="";
-this._firstChunk=true;
-
-this._loadedBytes=0;
-
-this._totalSize;
-this._jsonTokenizer=new WebInspector.TextUtils.BalancedJSONTokenizer(this._writeBalancedJSON.bind(this),true);
-};
-
-
-
-
-
-
-
-WebInspector.TimelineLoader.loadFromFile=function(model,file,delegate)
-{
-var loader=new WebInspector.TimelineLoader(model,delegate);
-var fileReader=WebInspector.TimelineLoader._createFileReader(file,loader);
-loader._canceledCallback=fileReader.cancel.bind(fileReader);
-loader._totalSize=file.size;
-fileReader.start(loader);
-return loader;
-};
-
-
-
-
-
-
-
-WebInspector.TimelineLoader.loadFromURL=function(model,url,delegate)
-{
-var stream=new WebInspector.TimelineLoader(model,delegate);
-WebInspector.ResourceLoader.loadAsStream(url,null,stream);
-return stream;
-};
-
-WebInspector.TimelineLoader.TransferChunkLengthBytes=5000000;
-
-
-
-
-
-
-WebInspector.TimelineLoader._createFileReader=function(file,delegate)
-{
-return new WebInspector.ChunkedFileReader(file,WebInspector.TimelineLoader.TransferChunkLengthBytes,delegate);
-};
-
-
-
-
-WebInspector.TimelineLoader.State={
-Initial:Symbol("Initial"),
-LookingForEvents:Symbol("LookingForEvents"),
-ReadingEvents:Symbol("ReadingEvents"),
-SkippingTail:Symbol("SkippingTail")};
-
-
-WebInspector.TimelineLoader.prototype={
-cancel:function()
-{
-this._model.reset();
-this._delegate.loadingComplete(false);
-this._delegate=null;
-if(this._canceledCallback)
-this._canceledCallback();
-},
-
-
-
-
-
-write:function(chunk)
-{
-if(!this._delegate)
-return;
-this._loadedBytes+=chunk.length;
-if(!this._firstChunk)
-this._delegate.loadingProgress(this._totalSize?this._loadedBytes/this._totalSize:undefined);
-
-if(this._state===WebInspector.TimelineLoader.State.Initial){
-if(chunk[0]==="{")
-this._state=WebInspector.TimelineLoader.State.LookingForEvents;else
-if(chunk[0]==="[")
-this._state=WebInspector.TimelineLoader.State.ReadingEvents;else
-{
-this._reportErrorAndCancelLoading(WebInspector.UIString("Malformed timeline data: Unknown JSON format"));
-return;
-}
-}
-
-if(this._state===WebInspector.TimelineLoader.State.LookingForEvents){
-var objectName="\"traceEvents\":";
-var startPos=this._buffer.length-objectName.length;
-this._buffer+=chunk;
-var pos=this._buffer.indexOf(objectName,startPos);
-if(pos===-1)
-return;
-chunk=this._buffer.slice(pos+objectName.length);
-this._state=WebInspector.TimelineLoader.State.ReadingEvents;
-}
-
-if(this._state!==WebInspector.TimelineLoader.State.ReadingEvents)
-return;
-if(this._jsonTokenizer.write(chunk))
-return;
-this._state=WebInspector.TimelineLoader.State.SkippingTail;
-if(this._firstChunk){
-this._reportErrorAndCancelLoading(WebInspector.UIString("Malformed timeline input, wrong JSON brackets balance"));
-return;
-}
-},
-
-
-
-
-_writeBalancedJSON:function(data)
-{
-var json=data+"]";
-
-if(this._firstChunk){
-this._delegate.loadingStarted();
-}else{
-var commaIndex=json.indexOf(",");
-if(commaIndex!==-1)
-json=json.slice(commaIndex+1);
-json="["+json;
-}
-
-var items;
-try{
-items=JSON.parse(json);
-}catch(e){
-this._reportErrorAndCancelLoading(WebInspector.UIString("Malformed timeline data: %s",e.toString()));
-return;
-}
-
-if(this._firstChunk){
-this._firstChunk=false;
-this._model.reset();
-if(this._looksLikeAppVersion(items[0])){
-this._reportErrorAndCancelLoading(WebInspector.UIString("Legacy Timeline format is not supported."));
-return;
-}
-}
-
-try{
-this._model.addEvents(items);
-}catch(e){
-this._reportErrorAndCancelLoading(WebInspector.UIString("Malformed timeline data: %s",e.toString()));
-return;
-}
-},
-
-
-
-
-_reportErrorAndCancelLoading:function(message)
-{
-if(message)
-WebInspector.console.error(message);
-this.cancel();
-},
-
-
-
-
-
-_looksLikeAppVersion:function(item)
-{
-return typeof item==="string"&&item.indexOf("Chrome")!==-1;
-},
-
-
-
-
-close:function()
-{
-this._model.tracingComplete();
-if(this._delegate)
-this._delegate.loadingComplete(true);
-},
-
-
-
-
-onTransferStarted:function(){},
-
-
-
-
-
-onChunkTransferred:function(reader){},
-
-
-
-
-onTransferFinished:function(){},
-
-
-
-
-
-
-onError:function(reader,event)
-{
-switch(event.target.error.name){
-case"NotFoundError":
-this._reportErrorAndCancelLoading(WebInspector.UIString("File \"%s\" not found.",reader.fileName()));
-break;
-case"NotReadableError":
-this._reportErrorAndCancelLoading(WebInspector.UIString("File \"%s\" is not readable",reader.fileName()));
-break;
-case"AbortError":
-break;
+case'activeborder':
+case'activecaption':
+case'appworkspace':
+case'background':
+case'buttonface':
+case'buttonhighlight':
+case'buttonshadow':
+case'buttontext':
+case'captiontext':
+case'graytext':
+case'highlight':
+case'highlighttext':
+case'inactiveborder':
+case'inactivecaption':
+case'inactivecaptiontext':
+case'infobackground':
+case'infotext':
+case'menu':
+case'menutext':
+case'scrollbar':
+case'threeddarkshadow':
+case'threedface':
+case'threedhighlight':
+case'threedlightshadow':
+case'threedshadow':
+case'window':
+case'windowframe':
+case'windowtext':
+return exports.TYPES.COLOR;
 default:
-this._reportErrorAndCancelLoading(WebInspector.UIString("An error occurred while reading the file \"%s\"",reader.fileName()));}
+return exports.TYPES.KEYWORD;}
 
-}};
-
-
-
-
-
-
-WebInspector.TracingTimelineSaver=function()
-{
 };
 
-WebInspector.TracingTimelineSaver.prototype={
-
-
-
-onTransferStarted:function(){},
-
-
-
-
-onTransferFinished:function(){},
-
-
-
-
-
-onChunkTransferred:function(reader){},
-
-
-
-
-
-
-onError:function(reader,event)
-{
-var error=event.target.error;
-WebInspector.console.error(WebInspector.UIString("Failed to save timeline: %s (%s, %s)",error.message,error.name,error.code));
-}};
-
-
-},{}],116:[function(require,module,exports){
-(function(process){
-
-
-
-
-
-
-exports=module.exports=require('./debug');
-exports.log=log;
-exports.formatArgs=formatArgs;
-exports.save=save;
-exports.load=load;
-exports.useColors=useColors;
-exports.storage='undefined'!=typeof chrome&&
-'undefined'!=typeof chrome.storage?
-chrome.storage.local:
-localstorage();
-
-
-
-
-
-exports.colors=[
-'lightseagreen',
-'forestgreen',
-'goldenrod',
-'dodgerblue',
-'darkorchid',
-'crimson'];
-
-
-
-
-
-
-
-
-
-
-function useColors(){
-
-
-
-if(typeof window!=='undefined'&&window.process&&window.process.type==='renderer'){
-return true;
-}
-
-
-
-return typeof document!=='undefined'&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||
-
-typeof window!=='undefined'&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||
-
-
-typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||
-
-typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
-}
-
-
-
-
-
-exports.formatters.j=function(v){
-try{
-return JSON.stringify(v);
-}catch(err){
-return'[UnexpectedJSONParseError]: '+err.message;
-}
-};
-
-
-
-
-
-
-
-
-function formatArgs(args){
-var useColors=this.useColors;
-
-args[0]=(useColors?'%c':'')+
-this.namespace+(
-useColors?' %c':' ')+
-args[0]+(
-useColors?'%c ':' ')+
-'+'+exports.humanize(this.diff);
-
-if(!useColors)return;
-
-var c='color: '+this.color;
-args.splice(1,0,c,'color: inherit');
-
-
-
-
-var index=0;
-var lastC=0;
-args[0].replace(/%[a-zA-Z%]/g,function(match){
-if('%%'===match)return;
-index++;
-if('%c'===match){
-
-
-lastC=index;
-}
-});
-
-args.splice(lastC,0,c);
-}
-
-
-
-
-
-
-
-
-function log(){
-
-
-return'object'===typeof console&&
-console.log&&
-Function.prototype.apply.call(console.log,console,arguments);
-}
-
-
-
-
-
-
-
-
-function save(namespaces){
-try{
-if(null==namespaces){
-exports.storage.removeItem('debug');
-}else{
-exports.storage.debug=namespaces;
-}
-}catch(e){}
-}
-
-
-
-
-
-
-
-
-function load(){
-var r;
-try{
-r=exports.storage.debug;
-}catch(e){}
-
-
-if(!r&&typeof process!=='undefined'&&'env'in process){
-r=process.env.DEBUG;
-}
-
-return r;
-}
-
-
-
-
-
-exports.enable(load());
-
-
-
-
-
-
-
-
-
-
-
-
-function localstorage(){
-try{
-return window.localStorage;
-}catch(e){}
-}
-
-}).call(this,require('_process'));
-},{"./debug":117,"_process":77}],117:[function(require,module,exports){
-
-
-
-
-
-
-
-
-exports=module.exports=createDebug.debug=createDebug['default']=createDebug;
-exports.coerce=coerce;
-exports.disable=disable;
-exports.enable=enable;
-exports.enabled=enabled;
-exports.humanize=require('ms');
-
-
-
-
-
-exports.names=[];
-exports.skips=[];
-
-
-
-
-
-
-
-exports.formatters={};
-
-
-
-
-
-var prevTime;
-
-
-
-
-
-
-
-
-function selectColor(namespace){
-var hash=0,i;
-
-for(i in namespace){
-hash=(hash<<5)-hash+namespace.charCodeAt(i);
-hash|=0;
-}
-
-return exports.colors[Math.abs(hash)%exports.colors.length];
-}
-
-
-
-
-
-
-
-
-
-function createDebug(namespace){
-
-function debug(){
-
-if(!debug.enabled)return;
-
-var self=debug;
-
-
-var curr=+new Date();
-var ms=curr-(prevTime||curr);
-self.diff=ms;
-self.prev=prevTime;
-self.curr=curr;
-prevTime=curr;
-
-
-var args=new Array(arguments.length);
-for(var i=0;i<args.length;i++){
-args[i]=arguments[i];
-}
-
-args[0]=exports.coerce(args[0]);
-
-if('string'!==typeof args[0]){
-
-args.unshift('%O');
-}
-
-
-var index=0;
-args[0]=args[0].replace(/%([a-zA-Z%])/g,function(match,format){
-
-if(match==='%%')return match;
-index++;
-var formatter=exports.formatters[format];
-if('function'===typeof formatter){
-var val=args[index];
-match=formatter.call(self,val);
-
-
-args.splice(index,1);
-index--;
-}
-return match;
-});
-
-
-exports.formatArgs.call(self,args);
-
-var logFn=debug.log||exports.log||console.log.bind(console);
-logFn.apply(self,args);
-}
-
-debug.namespace=namespace;
-debug.enabled=exports.enabled(namespace);
-debug.useColors=exports.useColors();
-debug.color=selectColor(namespace);
-
-
-if('function'===typeof exports.init){
-exports.init(debug);
-}
-
-return debug;
-}
-
-
-
-
-
-
-
-
-
-function enable(namespaces){
-exports.save(namespaces);
-
-exports.names=[];
-exports.skips=[];
-
-var split=(typeof namespaces==='string'?namespaces:'').split(/[\s,]+/);
-var len=split.length;
-
-for(var i=0;i<len;i++){
-if(!split[i])continue;
-namespaces=split[i].replace(/\*/g,'.*?');
-if(namespaces[0]==='-'){
-exports.skips.push(new RegExp('^'+namespaces.substr(1)+'$'));
-}else{
-exports.names.push(new RegExp('^'+namespaces+'$'));
-}
-}
-}
-
-
-
-
-
-
-
-function disable(){
-exports.enable('');
-}
-
-
-
-
-
-
-
-
-
-function enabled(name){
-var i,len;
-for(i=0,len=exports.skips.length;i<len;i++){
-if(exports.skips[i].test(name)){
-return false;
-}
-}
-for(i=0,len=exports.names.length;i<len;i++){
-if(exports.names[i].test(name)){
-return true;
-}
-}
-return false;
-}
-
-
-
-
-
-
-
-
-
-function coerce(val){
-if(val instanceof Error)return val.stack||val.message;
+exports.parseInteger=function parseInteger(val){
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
 return val;
 }
+if(type!==exports.TYPES.INTEGER){
+return undefined;
+}
+return String(parseInt(val,10));
+};
 
-},{"ms":128}],118:[function(require,module,exports){
+exports.parseNumber=function parseNumber(val){
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+if(type!==exports.TYPES.NUMBER&&type!==exports.TYPES.INTEGER){
+return undefined;
+}
+return String(parseFloat(val));
+};
+
+exports.parseLength=function parseLength(val){
+if(val===0||val==='0'){
+return'0px';
+}
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+if(type!==exports.TYPES.LENGTH){
+return undefined;
+}
+return val;
+};
+
+exports.parsePercent=function parsePercent(val){
+if(val===0||val==='0'){
+return'0%';
+}
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+if(type!==exports.TYPES.PERCENT){
+return undefined;
+}
+return val;
+};
+
+
+exports.parseMeasurement=function parseMeasurement(val){
+var length=exports.parseLength(val);
+if(length!==undefined){
+return length;
+}
+return exports.parsePercent(val);
+};
+
+exports.parseUrl=function parseUrl(val){
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+var res=urlRegEx.exec(val);
+
+if(!res){
+return undefined;
+}
+var str=res[1];
+
+if((str[0]==='"'||str[0]==="'")&&str[0]!==str[str.length-1]){
+return undefined;
+}
+if(str[0]==='"'||str[0]==="'"){
+str=str.substr(1,str.length-2);
+}
+
+var i;
+for(i=0;i<str.length;i++){
+switch(str[i]){
+case'(':
+case')':
+case' ':
+case'\t':
+case'\n':
+case"'":
+case'"':
+return undefined;
+case'\\':
+i++;
+break;}
+
+}
+
+return'url('+str+')';
+};
+
+exports.parseString=function parseString(val){
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+if(type!==exports.TYPES.STRING){
+return undefined;
+}
+var i;
+for(i=1;i<val.length-1;i++){
+switch(val[i]){
+case val[0]:
+return undefined;
+case'\\':
+i++;
+while(i<val.length-1&&/[0-9A-Fa-f]/.test(val[i])){
+i++;
+}
+break;}
+
+}
+if(i>=val.length){
+return undefined;
+}
+return val;
+};
+
+exports.parseColor=function parseColor(val){
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+var red,green,blue,alpha=1;
+var parts;
+var res=colorRegEx1.exec(val);
+
+if(res){
+var hex=val.substr(1);
+if(hex.length===3){
+hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
+}
+red=parseInt(hex.substr(0,2),16);
+green=parseInt(hex.substr(2,2),16);
+blue=parseInt(hex.substr(4,2),16);
+return'rgb('+red+', '+green+', '+blue+')';
+}
+
+res=colorRegEx2.exec(val);
+if(res){
+parts=res[1].split(/\s*,\s*/);
+if(parts.length!==3){
+return undefined;
+}
+if(parts.every(percentRegEx.test.bind(percentRegEx))){
+red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
+green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
+blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
+}else if(parts.every(integerRegEx.test.bind(integerRegEx))){
+red=parseInt(parts[0],10);
+green=parseInt(parts[1],10);
+blue=parseInt(parts[2],10);
+}else{
+return undefined;
+}
+red=Math.min(255,Math.max(0,red));
+green=Math.min(255,Math.max(0,green));
+blue=Math.min(255,Math.max(0,blue));
+return'rgb('+red+', '+green+', '+blue+')';
+}
+
+res=colorRegEx3.exec(val);
+if(res){
+parts=res[1].split(/\s*,\s*/);
+if(parts.length!==4){
+return undefined;
+}
+if(parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))){
+red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
+green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
+blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
+alpha=parseFloat(parts[3]);
+}else if(parts.slice(0,3).every(integerRegEx.test.bind(integerRegEx))){
+red=parseInt(parts[0],10);
+green=parseInt(parts[1],10);
+blue=parseInt(parts[2],10);
+alpha=parseFloat(parts[3]);
+}else{
+return undefined;
+}
+if(isNaN(alpha)){
+alpha=1;
+}
+red=Math.min(255,Math.max(0,red));
+green=Math.min(255,Math.max(0,green));
+blue=Math.min(255,Math.max(0,blue));
+alpha=Math.min(1,Math.max(0,alpha));
+if(alpha===1){
+return'rgb('+red+', '+green+', '+blue+')';
+}
+return'rgba('+red+', '+green+', '+blue+', '+alpha+')';
+}
+
+if(type===exports.TYPES.COLOR){
+return val;
+}
+return undefined;
+};
+
+exports.parseAngle=function parseAngle(val){
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+if(type!==exports.TYPES.ANGLE){
+return undefined;
+}
+var res=angleRegEx.exec(val);
+var flt=parseFloat(res[1]);
+if(res[2]==='rad'){
+flt*=180/Math.PI;
+}else if(res[2]==='grad'){
+flt*=360/400;
+}
+
+while(flt<0){
+flt+=360;
+}
+while(flt>360){
+flt-=360;
+}
+return flt+'deg';
+};
+
+exports.parseKeyword=function parseKeyword(val,valid_keywords){
+var type=exports.valueType(val);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+return val;
+}
+if(type!==exports.TYPES.KEYWORD){
+return undefined;
+}
+val=val.toString().toLowerCase();
+var i;
+for(i=0;i<valid_keywords.length;i++){
+if(valid_keywords[i].toLowerCase()===val){
+return valid_keywords[i];
+}
+}
+return undefined;
+};
+
+
+var dashedToCamelCase=function(dashed){
+var i;
+var camel='';
+var nextCap=false;
+for(i=0;i<dashed.length;i++){
+if(dashed[i]!=='-'){
+camel+=nextCap?dashed[i].toUpperCase():dashed[i];
+nextCap=false;
+}else{
+nextCap=true;
+}
+}
+return camel;
+};
+exports.dashedToCamelCase=dashedToCamelCase;
+
+var is_space=/\s/;
+var opening_deliminators=['"','\'','('];
+var closing_deliminators=['"','\'',')'];
+
+var getParts=function(str){
+var deliminator_stack=[];
+var length=str.length;
+var i;
+var parts=[];
+var current_part='';
+var opening_index;
+var closing_index;
+for(i=0;i<length;i++){
+opening_index=opening_deliminators.indexOf(str[i]);
+closing_index=closing_deliminators.indexOf(str[i]);
+if(is_space.test(str[i])){
+if(deliminator_stack.length===0){
+if(current_part!==''){
+parts.push(current_part);
+}
+current_part='';
+}else{
+current_part+=str[i];
+}
+}else{
+if(str[i]==='\\'){
+i++;
+current_part+=str[i];
+}else{
+current_part+=str[i];
+if(closing_index!==-1&&closing_index===deliminator_stack[deliminator_stack.length-1]){
+deliminator_stack.pop();
+}else if(opening_index!==-1){
+deliminator_stack.push(opening_index);
+}
+}
+}
+}
+if(current_part!==''){
+parts.push(current_part);
+}
+return parts;
+};
+
+
+
+
+
+
+
+exports.shorthandParser=function parse(v,shorthand_for){
+var obj={};
+var type=exports.valueType(v);
+if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+Object.keys(shorthand_for).forEach(function(property){
+obj[property]='';
+});
+return obj;
+}
+
+if(typeof v==='number'){
+v=v.toString();
+}
+
+if(typeof v!=='string'){
+return undefined;
+}
+
+if(v.toLowerCase()==='inherit'){
+return{};
+}
+var parts=getParts(v);
+var valid=true;
+parts.forEach(function(part){
+var part_valid=false;
+Object.keys(shorthand_for).forEach(function(property){
+if(shorthand_for[property].isValid(part)){
+part_valid=true;
+obj[property]=part;
+}
+});
+valid=valid&&part_valid;
+});
+if(!valid){
+return undefined;
+}
+return obj;
+};
+
+exports.shorthandSetter=function(property,shorthand_for){
+return function(v){
+var obj=exports.shorthandParser(v,shorthand_for);
+if(obj===undefined){
+return;
+}
+
+Object.keys(obj).forEach(function(subprop){
+
+
+var camel=dashedToCamelCase(subprop);
+this[camel]=obj[subprop];
+
+obj[subprop]=this[camel];
+this.removeProperty(subprop);
+
+if(obj[subprop]!==''){
+this._values[subprop]=obj[subprop];
+}
+},this);
+Object.keys(shorthand_for).forEach(function(subprop){
+if(!obj.hasOwnProperty(subprop)){
+this.removeProperty(subprop);
+delete this._values[subprop];
+}
+},this);
+
+
+
+
+this.removeProperty(property);
+var calculated=exports.shorthandGetter(property,shorthand_for).call(this);
+if(calculated!==''){
+this._setProperty(property,calculated);
+}
+};
+};
+
+exports.shorthandGetter=function(property,shorthand_for){
+return function(){
+if(this._values[property]!==undefined){
+return this.getPropertyValue(property);
+}
+return Object.keys(shorthand_for).map(function(subprop){
+return this.getPropertyValue(subprop);
+},this).filter(function(value){
+return value!=='';
+}).join(' ');
+};
+};
+
+
+
+
+
+
+exports.implicitSetter=function(property_before,property_after,isValid,parser){
+property_after=property_after||'';
+if(property_after!==''){
+property_after='-'+property_after;
+}
+var part_names=["top","right","bottom","left"];
+
+return function(v){
+if(typeof v==='number'){
+v=v.toString();
+}
+if(typeof v!=='string'){
+return undefined;
+}
+var parts;
+if(v.toLowerCase()==='inherit'||v===''){
+parts=[v];
+}else{
+parts=getParts(v);
+}
+if(parts.length<1||parts.length>4){
+return undefined;
+}
+
+if(!parts.every(isValid)){
+return undefined;
+}
+
+parts=parts.map(function(part){
+return parser(part);
+});
+this._setProperty(property_before+property_after,parts.join(' '));
+if(parts.length===1){
+parts[1]=parts[0];
+}
+if(parts.length===2){
+parts[2]=parts[0];
+}
+if(parts.length===3){
+parts[3]=parts[1];
+}
+
+for(var i=0;i<4;i++){
+var property=property_before+"-"+part_names[i]+property_after;
+this.removeProperty(property);
+if(parts[i]!==''){
+this._values[property]=parts[i];
+}
+}
+return v;
+};
+};
+
+
+
+
+
+
+
+exports.subImplicitSetter=function(prefix,part,isValid,parser){
+var property=prefix+'-'+part;
+var subparts=[prefix+"-top",prefix+"-right",prefix+"-bottom",prefix+"-left"];
+
+return function(v){
+if(typeof v==='number'){
+v=v.toString();
+}
+if(typeof v!=='string'){
+return undefined;
+}
+if(!isValid(v)){
+return undefined;
+}
+v=parser(v);
+this._setProperty(property,v);
+var parts=[];
+for(var i=0;i<4;i++){
+if(this._values[subparts[i]]==null||this._values[subparts[i]]===''){
+break;
+}
+parts.push(this._values[subparts[i]]);
+}
+if(parts.length===4){
+for(i=0;i<4;i++){
+this.removeProperty(subparts[i]);
+this._values[subparts[i]]=parts[i];
+}
+this._setProperty(prefix,parts.join(" "));
+}
+return v;
+};
+};
+
+
+var camel_to_dashed=/[A-Z]/g;
+
+var first_segment=/^\([^\-]\)-/;
+
+var vendor_prefixes=['o','moz','ms','webkit'];
+exports.camelToDashed=function(camel_case){
+var match;
+var dashed=camel_case.replace(camel_to_dashed,'-$&').toLowerCase();
+match=dashed.match(first_segment);
+if(match&&vendor_prefixes.indexOf(match[1])!==-1){
+dashed='-'+dashed;
+}
+return dashed;
+};
+
+},{}],162:[function(require,module,exports){
 (function webpackUniversalModuleDefinition(root,factory){
 
 if(typeof exports==='object'&&typeof module==='object')
@@ -52673,7 +68615,7 @@
 var syntax_1=__webpack_require__(2);
 exports.Syntax=syntax_1.Syntax;
 
-exports.version='4.0.0';
+exports.version='4.0.1';
 
 
 },
@@ -54610,11 +70552,18 @@
 column:this.startMarker.column};
 
 };
-Parser.prototype.startNode=function(token){
+Parser.prototype.startNode=function(token,lastLineStart){
+if(lastLineStart===void 0){lastLineStart=0;}
+var column=token.start-token.lineStart;
+var line=token.lineNumber;
+if(column<0){
+column+=lastLineStart;
+line--;
+}
 return{
 index:token.start,
-line:token.lineNumber,
-column:token.start-token.lineStart};
+line:line,
+column:column};
 
 };
 Parser.prototype.finalize=function(marker,node){
@@ -54946,7 +70895,7 @@
 var isGenerator=false;
 var node=this.createNode();
 var previousAllowYield=this.context.allowYield;
-this.context.allowYield=false;
+this.context.allowYield=true;
 var params=this.parseFormalParameters();
 var method=this.parsePropertyMethod(params);
 this.context.allowYield=previousAllowYield;
@@ -55016,7 +70965,7 @@
 this.nextToken();
 computed=this.match('[');
 isAsync=!this.hasLineTerminator&&id==='async'&&
-!this.match(':')&&!this.match('(')&&!this.match('*');
+!this.match(':')&&!this.match('(')&&!this.match('*')&&!this.match(',');
 key=isAsync?this.parseObjectPropertyKey():this.finalize(node,new Node.Identifier(id));
 }else
 if(this.match('*')){
@@ -55615,12 +71564,15 @@
 
 var i=stack.length-1;
 expr=stack[i];
-markers.pop();
+var lastMarker=markers.pop();
 while(i>1){
-var node=this.startNode(markers.pop());
+var marker=markers.pop();
+var lastLineStart=lastMarker&&lastMarker.lineStart;
+var node=this.startNode(marker,lastLineStart);
 var operator=stack[i-1];
 expr=this.finalize(node,new Node.BinaryExpression(operator,stack[i-2],expr));
 i-=2;
+lastMarker=marker;
 }
 }
 return expr;
@@ -56403,7 +72355,9 @@
 var node=this.createNode();
 this.expectKeyword('return');
 var hasArgument=!this.match(';')&&!this.match('}')&&
-!this.hasLineTerminator&&this.lookahead.type!==2;
+!this.hasLineTerminator&&this.lookahead.type!==2||
+this.lookahead.type===8||
+this.lookahead.type===10;
 var argument=hasArgument?this.parseExpression():null;
 this.consumeSemicolon();
 return this.finalize(node,new Node.ReturnStatement(argument));
@@ -56968,7 +72922,7 @@
 var node=this.createNode();
 var isGenerator=false;
 var previousAllowYield=this.context.allowYield;
-this.context.allowYield=false;
+this.context.allowYield=!isGenerator;
 var formalParameters=this.parseFormalParameters();
 if(formalParameters.params.length>0){
 this.tolerateError(messages_1.Messages.BadGetterArity);
@@ -56981,7 +72935,7 @@
 var node=this.createNode();
 var isGenerator=false;
 var previousAllowYield=this.context.allowYield;
-this.context.allowYield=false;
+this.context.allowYield=!isGenerator;
 var formalParameters=this.parseFormalParameters();
 if(formalParameters.params.length!==1){
 this.tolerateError(messages_1.Messages.BadSetterArity);
@@ -57082,17 +73036,12 @@
 isAsync=true;
 token=this.lookahead;
 key=this.parseObjectPropertyKey();
-if(token.type===3){
-if(token.value==='get'||token.value==='set'){
-this.tolerateUnexpectedToken(token);
-}else
-if(token.value==='constructor'){
+if(token.type===3&&token.value==='constructor'){
 this.tolerateUnexpectedToken(token,messages_1.Messages.ConstructorIsAsync);
 }
 }
 }
 }
-}
 var lookaheadPropertyKey=this.qualifiedPropertyName(this.lookahead);
 if(token.type===3){
 if(token.value==='get'&&lookaheadPropertyKey){
@@ -57201,6 +73150,7 @@
 Parser.prototype.parseModule=function(){
 this.context.strict=true;
 this.context.isModule=true;
+this.scanner.isModule=true;
 var node=this.createNode();
 var body=this.parseDirectivePrologues();
 while(this.lookahead.type!==2){
@@ -57629,6 +73579,7 @@
 this.source=code;
 this.errorHandler=handler;
 this.trackComment=false;
+this.isModule=false;
 this.length=code.length;
 this.index=0;
 this.lineNumber=code.length>0?1:0;
@@ -57834,7 +73785,7 @@
 break;
 }
 }else
-if(ch===0x3C){
+if(ch===0x3C&&!this.isModule){
 if(this.source.slice(this.index+1,this.index+4)==='!--'){
 this.index+=4;
 var comment=this.skipSingleLineComment(4);
@@ -59198,7 +75149,7 @@
 
 });
 ;
-},{}],119:[function(require,module,exports){
+},{}],163:[function(require,module,exports){
 (function(Buffer){
 var querystring=require('querystring');
 var trim=require('./trim');
@@ -59505,12 +75456,12 @@
 module.exports=Link;
 
 }).call(this,{"isBuffer":require("../../../lighthouse-extension/node_modules/is-buffer/index.js")});
-},{"../../../lighthouse-extension/node_modules/is-buffer/index.js":65,"./trim":120,"querystring":80}],120:[function(require,module,exports){
+},{"../../../lighthouse-extension/node_modules/is-buffer/index.js":114,"./trim":164,"querystring":129}],164:[function(require,module,exports){
 module.exports=function trim(value){
 return value.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,'');
 };
 
-},{}],121:[function(require,module,exports){
+},{}],165:[function(require,module,exports){
 
 
 
@@ -59655,7 +75606,2022 @@
 })(ImageSSIM||(ImageSSIM={}));
 module.exports=ImageSSIM;
 
-},{}],122:[function(require,module,exports){
+},{}],166:[function(require,module,exports){
+'use strict';
+
+exports=module.exports=require('./lib/parser')['default'];
+exports['default']=exports;
+
+},{"./lib/parser":167}],167:[function(require,module,exports){
+"use strict";
+
+exports["default"]=function(){
+"use strict";
+
+
+
+
+
+
+
+function peg$subclass(child,parent){
+function ctor(){this.constructor=child;}
+ctor.prototype=parent.prototype;
+child.prototype=new ctor();
+}
+
+function peg$SyntaxError(message,expected,found,location){
+this.message=message;
+this.expected=expected;
+this.found=found;
+this.location=location;
+this.name="SyntaxError";
+
+if(typeof Error.captureStackTrace==="function"){
+Error.captureStackTrace(this,peg$SyntaxError);
+}
+}
+
+peg$subclass(peg$SyntaxError,Error);
+
+function peg$parse(input){
+var options=arguments.length>1?arguments[1]:{},
+parser=this,
+
+peg$FAILED={},
+
+peg$startRuleFunctions={start:peg$parsestart},
+peg$startRuleFunction=peg$parsestart,
+
+peg$c0=function(elements){
+return{
+type:'messageFormatPattern',
+elements:elements,
+location:location()};
+
+},
+peg$c1=function(text){
+var string='',
+i,j,outerLen,inner,innerLen;
+
+for(i=0,outerLen=text.length;i<outerLen;i+=1){
+inner=text[i];
+
+for(j=0,innerLen=inner.length;j<innerLen;j+=1){
+string+=inner[j];
+}
+}
+
+return string;
+},
+peg$c2=function(messageText){
+return{
+type:'messageTextElement',
+value:messageText,
+location:location()};
+
+},
+peg$c3=/^[^ \t\n\r,.+={}#]/,
+peg$c4={type:"class",value:"[^ \\t\\n\\r,.+={}#]",description:"[^ \\t\\n\\r,.+={}#]"},
+peg$c5="{",
+peg$c6={type:"literal",value:"{",description:"\"{\""},
+peg$c7=",",
+peg$c8={type:"literal",value:",",description:"\",\""},
+peg$c9="}",
+peg$c10={type:"literal",value:"}",description:"\"}\""},
+peg$c11=function(id,format){
+return{
+type:'argumentElement',
+id:id,
+format:format&&format[2],
+location:location()};
+
+},
+peg$c12="number",
+peg$c13={type:"literal",value:"number",description:"\"number\""},
+peg$c14="date",
+peg$c15={type:"literal",value:"date",description:"\"date\""},
+peg$c16="time",
+peg$c17={type:"literal",value:"time",description:"\"time\""},
+peg$c18=function(type,style){
+return{
+type:type+'Format',
+style:style&&style[2],
+location:location()};
+
+},
+peg$c19="plural",
+peg$c20={type:"literal",value:"plural",description:"\"plural\""},
+peg$c21=function(pluralStyle){
+return{
+type:pluralStyle.type,
+ordinal:false,
+offset:pluralStyle.offset||0,
+options:pluralStyle.options,
+location:location()};
+
+},
+peg$c22="selectordinal",
+peg$c23={type:"literal",value:"selectordinal",description:"\"selectordinal\""},
+peg$c24=function(pluralStyle){
+return{
+type:pluralStyle.type,
+ordinal:true,
+offset:pluralStyle.offset||0,
+options:pluralStyle.options,
+location:location()};
+
+},
+peg$c25="select",
+peg$c26={type:"literal",value:"select",description:"\"select\""},
+peg$c27=function(options){
+return{
+type:'selectFormat',
+options:options,
+location:location()};
+
+},
+peg$c28="=",
+peg$c29={type:"literal",value:"=",description:"\"=\""},
+peg$c30=function(selector,pattern){
+return{
+type:'optionalFormatPattern',
+selector:selector,
+value:pattern,
+location:location()};
+
+},
+peg$c31="offset:",
+peg$c32={type:"literal",value:"offset:",description:"\"offset:\""},
+peg$c33=function(number){
+return number;
+},
+peg$c34=function(offset,options){
+return{
+type:'pluralFormat',
+offset:offset,
+options:options,
+location:location()};
+
+},
+peg$c35={type:"other",description:"whitespace"},
+peg$c36=/^[ \t\n\r]/,
+peg$c37={type:"class",value:"[ \\t\\n\\r]",description:"[ \\t\\n\\r]"},
+peg$c38={type:"other",description:"optionalWhitespace"},
+peg$c39=/^[0-9]/,
+peg$c40={type:"class",value:"[0-9]",description:"[0-9]"},
+peg$c41=/^[0-9a-f]/i,
+peg$c42={type:"class",value:"[0-9a-f]i",description:"[0-9a-f]i"},
+peg$c43="0",
+peg$c44={type:"literal",value:"0",description:"\"0\""},
+peg$c45=/^[1-9]/,
+peg$c46={type:"class",value:"[1-9]",description:"[1-9]"},
+peg$c47=function(digits){
+return parseInt(digits,10);
+},
+peg$c48=/^[^{}\\\0-\x1F \t\n\r]/,
+peg$c49={type:"class",value:"[^{}\\\\\\0-\\x1F\\x7f \\t\\n\\r]",description:"[^{}\\\\\\0-\\x1F\\x7f \\t\\n\\r]"},
+peg$c50="\\\\",
+peg$c51={type:"literal",value:"\\\\",description:"\"\\\\\\\\\""},
+peg$c52=function(){return'\\';},
+peg$c53="\\#",
+peg$c54={type:"literal",value:"\\#",description:"\"\\\\#\""},
+peg$c55=function(){return'\\#';},
+peg$c56="\\{",
+peg$c57={type:"literal",value:"\\{",description:"\"\\\\{\""},
+peg$c58=function(){return'\u007B';},
+peg$c59="\\}",
+peg$c60={type:"literal",value:"\\}",description:"\"\\\\}\""},
+peg$c61=function(){return'\u007D';},
+peg$c62="\\u",
+peg$c63={type:"literal",value:"\\u",description:"\"\\\\u\""},
+peg$c64=function(digits){
+return String.fromCharCode(parseInt(digits,16));
+},
+peg$c65=function(chars){return chars.join('');},
+
+peg$currPos=0,
+peg$savedPos=0,
+peg$posDetailsCache=[{line:1,column:1,seenCR:false}],
+peg$maxFailPos=0,
+peg$maxFailExpected=[],
+peg$silentFails=0,
+
+peg$result;
+
+if("startRule"in options){
+if(!(options.startRule in peg$startRuleFunctions)){
+throw new Error("Can't start parsing from rule \""+options.startRule+"\".");
+}
+
+peg$startRuleFunction=peg$startRuleFunctions[options.startRule];
+}
+
+function text(){
+return input.substring(peg$savedPos,peg$currPos);
+}
+
+function location(){
+return peg$computeLocation(peg$savedPos,peg$currPos);
+}
+
+function expected(description){
+throw peg$buildException(
+null,
+[{type:"other",description:description}],
+input.substring(peg$savedPos,peg$currPos),
+peg$computeLocation(peg$savedPos,peg$currPos));
+
+}
+
+function error(message){
+throw peg$buildException(
+message,
+null,
+input.substring(peg$savedPos,peg$currPos),
+peg$computeLocation(peg$savedPos,peg$currPos));
+
+}
+
+function peg$computePosDetails(pos){
+var details=peg$posDetailsCache[pos],
+p,ch;
+
+if(details){
+return details;
+}else{
+p=pos-1;
+while(!peg$posDetailsCache[p]){
+p--;
+}
+
+details=peg$posDetailsCache[p];
+details={
+line:details.line,
+column:details.column,
+seenCR:details.seenCR};
+
+
+while(p<pos){
+ch=input.charAt(p);
+if(ch==="\n"){
+if(!details.seenCR){details.line++;}
+details.column=1;
+details.seenCR=false;
+}else if(ch==="\r"||ch==="\u2028"||ch==="\u2029"){
+details.line++;
+details.column=1;
+details.seenCR=true;
+}else{
+details.column++;
+details.seenCR=false;
+}
+
+p++;
+}
+
+peg$posDetailsCache[pos]=details;
+return details;
+}
+}
+
+function peg$computeLocation(startPos,endPos){
+var startPosDetails=peg$computePosDetails(startPos),
+endPosDetails=peg$computePosDetails(endPos);
+
+return{
+start:{
+offset:startPos,
+line:startPosDetails.line,
+column:startPosDetails.column},
+
+end:{
+offset:endPos,
+line:endPosDetails.line,
+column:endPosDetails.column}};
+
+
+}
+
+function peg$fail(expected){
+if(peg$currPos<peg$maxFailPos){return;}
+
+if(peg$currPos>peg$maxFailPos){
+peg$maxFailPos=peg$currPos;
+peg$maxFailExpected=[];
+}
+
+peg$maxFailExpected.push(expected);
+}
+
+function peg$buildException(message,expected,found,location){
+function cleanupExpected(expected){
+var i=1;
+
+expected.sort(function(a,b){
+if(a.description<b.description){
+return-1;
+}else if(a.description>b.description){
+return 1;
+}else{
+return 0;
+}
+});
+
+while(i<expected.length){
+if(expected[i-1]===expected[i]){
+expected.splice(i,1);
+}else{
+i++;
+}
+}
+}
+
+function buildMessage(expected,found){
+function stringEscape(s){
+function hex(ch){return ch.charCodeAt(0).toString(16).toUpperCase();}
+
+return s.
+replace(/\\/g,'\\\\').
+replace(/"/g,'\\"').
+replace(/\x08/g,'\\b').
+replace(/\t/g,'\\t').
+replace(/\n/g,'\\n').
+replace(/\f/g,'\\f').
+replace(/\r/g,'\\r').
+replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(ch){return'\\x0'+hex(ch);}).
+replace(/[\x10-\x1F\x80-\xFF]/g,function(ch){return'\\x'+hex(ch);}).
+replace(/[\u0100-\u0FFF]/g,function(ch){return'\\u0'+hex(ch);}).
+replace(/[\u1000-\uFFFF]/g,function(ch){return'\\u'+hex(ch);});
+}
+
+var expectedDescs=new Array(expected.length),
+expectedDesc,foundDesc,i;
+
+for(i=0;i<expected.length;i++){
+expectedDescs[i]=expected[i].description;
+}
+
+expectedDesc=expected.length>1?
+expectedDescs.slice(0,-1).join(", ")+
+" or "+
+expectedDescs[expected.length-1]:
+expectedDescs[0];
+
+foundDesc=found?"\""+stringEscape(found)+"\"":"end of input";
+
+return"Expected "+expectedDesc+" but "+foundDesc+" found.";
+}
+
+if(expected!==null){
+cleanupExpected(expected);
+}
+
+return new peg$SyntaxError(
+message!==null?message:buildMessage(expected,found),
+expected,
+found,
+location);
+
+}
+
+function peg$parsestart(){
+var s0;
+
+s0=peg$parsemessageFormatPattern();
+
+return s0;
+}
+
+function peg$parsemessageFormatPattern(){
+var s0,s1,s2;
+
+s0=peg$currPos;
+s1=[];
+s2=peg$parsemessageFormatElement();
+while(s2!==peg$FAILED){
+s1.push(s2);
+s2=peg$parsemessageFormatElement();
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c0(s1);
+}
+s0=s1;
+
+return s0;
+}
+
+function peg$parsemessageFormatElement(){
+var s0;
+
+s0=peg$parsemessageTextElement();
+if(s0===peg$FAILED){
+s0=peg$parseargumentElement();
+}
+
+return s0;
+}
+
+function peg$parsemessageText(){
+var s0,s1,s2,s3,s4,s5;
+
+s0=peg$currPos;
+s1=[];
+s2=peg$currPos;
+s3=peg$parse_();
+if(s3!==peg$FAILED){
+s4=peg$parsechars();
+if(s4!==peg$FAILED){
+s5=peg$parse_();
+if(s5!==peg$FAILED){
+s3=[s3,s4,s5];
+s2=s3;
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+if(s2!==peg$FAILED){
+while(s2!==peg$FAILED){
+s1.push(s2);
+s2=peg$currPos;
+s3=peg$parse_();
+if(s3!==peg$FAILED){
+s4=peg$parsechars();
+if(s4!==peg$FAILED){
+s5=peg$parse_();
+if(s5!==peg$FAILED){
+s3=[s3,s4,s5];
+s2=s3;
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+}
+}else{
+s1=peg$FAILED;
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c1(s1);
+}
+s0=s1;
+if(s0===peg$FAILED){
+s0=peg$currPos;
+s1=peg$parsews();
+if(s1!==peg$FAILED){
+s0=input.substring(s0,peg$currPos);
+}else{
+s0=s1;
+}
+}
+
+return s0;
+}
+
+function peg$parsemessageTextElement(){
+var s0,s1;
+
+s0=peg$currPos;
+s1=peg$parsemessageText();
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c2(s1);
+}
+s0=s1;
+
+return s0;
+}
+
+function peg$parseargument(){
+var s0,s1,s2;
+
+s0=peg$parsenumber();
+if(s0===peg$FAILED){
+s0=peg$currPos;
+s1=[];
+if(peg$c3.test(input.charAt(peg$currPos))){
+s2=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s2=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c4);}
+}
+if(s2!==peg$FAILED){
+while(s2!==peg$FAILED){
+s1.push(s2);
+if(peg$c3.test(input.charAt(peg$currPos))){
+s2=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s2=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c4);}
+}
+}
+}else{
+s1=peg$FAILED;
+}
+if(s1!==peg$FAILED){
+s0=input.substring(s0,peg$currPos);
+}else{
+s0=s1;
+}
+}
+
+return s0;
+}
+
+function peg$parseargumentElement(){
+var s0,s1,s2,s3,s4,s5,s6,s7,s8;
+
+s0=peg$currPos;
+if(input.charCodeAt(peg$currPos)===123){
+s1=peg$c5;
+peg$currPos++;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c6);}
+}
+if(s1!==peg$FAILED){
+s2=peg$parse_();
+if(s2!==peg$FAILED){
+s3=peg$parseargument();
+if(s3!==peg$FAILED){
+s4=peg$parse_();
+if(s4!==peg$FAILED){
+s5=peg$currPos;
+if(input.charCodeAt(peg$currPos)===44){
+s6=peg$c7;
+peg$currPos++;
+}else{
+s6=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c8);}
+}
+if(s6!==peg$FAILED){
+s7=peg$parse_();
+if(s7!==peg$FAILED){
+s8=peg$parseelementFormat();
+if(s8!==peg$FAILED){
+s6=[s6,s7,s8];
+s5=s6;
+}else{
+peg$currPos=s5;
+s5=peg$FAILED;
+}
+}else{
+peg$currPos=s5;
+s5=peg$FAILED;
+}
+}else{
+peg$currPos=s5;
+s5=peg$FAILED;
+}
+if(s5===peg$FAILED){
+s5=null;
+}
+if(s5!==peg$FAILED){
+s6=peg$parse_();
+if(s6!==peg$FAILED){
+if(input.charCodeAt(peg$currPos)===125){
+s7=peg$c9;
+peg$currPos++;
+}else{
+s7=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c10);}
+}
+if(s7!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c11(s3,s5);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parseelementFormat(){
+var s0;
+
+s0=peg$parsesimpleFormat();
+if(s0===peg$FAILED){
+s0=peg$parsepluralFormat();
+if(s0===peg$FAILED){
+s0=peg$parseselectOrdinalFormat();
+if(s0===peg$FAILED){
+s0=peg$parseselectFormat();
+}
+}
+}
+
+return s0;
+}
+
+function peg$parsesimpleFormat(){
+var s0,s1,s2,s3,s4,s5,s6;
+
+s0=peg$currPos;
+if(input.substr(peg$currPos,6)===peg$c12){
+s1=peg$c12;
+peg$currPos+=6;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c13);}
+}
+if(s1===peg$FAILED){
+if(input.substr(peg$currPos,4)===peg$c14){
+s1=peg$c14;
+peg$currPos+=4;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c15);}
+}
+if(s1===peg$FAILED){
+if(input.substr(peg$currPos,4)===peg$c16){
+s1=peg$c16;
+peg$currPos+=4;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c17);}
+}
+}
+}
+if(s1!==peg$FAILED){
+s2=peg$parse_();
+if(s2!==peg$FAILED){
+s3=peg$currPos;
+if(input.charCodeAt(peg$currPos)===44){
+s4=peg$c7;
+peg$currPos++;
+}else{
+s4=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c8);}
+}
+if(s4!==peg$FAILED){
+s5=peg$parse_();
+if(s5!==peg$FAILED){
+s6=peg$parsechars();
+if(s6!==peg$FAILED){
+s4=[s4,s5,s6];
+s3=s4;
+}else{
+peg$currPos=s3;
+s3=peg$FAILED;
+}
+}else{
+peg$currPos=s3;
+s3=peg$FAILED;
+}
+}else{
+peg$currPos=s3;
+s3=peg$FAILED;
+}
+if(s3===peg$FAILED){
+s3=null;
+}
+if(s3!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c18(s1,s3);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parsepluralFormat(){
+var s0,s1,s2,s3,s4,s5;
+
+s0=peg$currPos;
+if(input.substr(peg$currPos,6)===peg$c19){
+s1=peg$c19;
+peg$currPos+=6;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c20);}
+}
+if(s1!==peg$FAILED){
+s2=peg$parse_();
+if(s2!==peg$FAILED){
+if(input.charCodeAt(peg$currPos)===44){
+s3=peg$c7;
+peg$currPos++;
+}else{
+s3=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c8);}
+}
+if(s3!==peg$FAILED){
+s4=peg$parse_();
+if(s4!==peg$FAILED){
+s5=peg$parsepluralStyle();
+if(s5!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c21(s5);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parseselectOrdinalFormat(){
+var s0,s1,s2,s3,s4,s5;
+
+s0=peg$currPos;
+if(input.substr(peg$currPos,13)===peg$c22){
+s1=peg$c22;
+peg$currPos+=13;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c23);}
+}
+if(s1!==peg$FAILED){
+s2=peg$parse_();
+if(s2!==peg$FAILED){
+if(input.charCodeAt(peg$currPos)===44){
+s3=peg$c7;
+peg$currPos++;
+}else{
+s3=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c8);}
+}
+if(s3!==peg$FAILED){
+s4=peg$parse_();
+if(s4!==peg$FAILED){
+s5=peg$parsepluralStyle();
+if(s5!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c24(s5);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parseselectFormat(){
+var s0,s1,s2,s3,s4,s5,s6;
+
+s0=peg$currPos;
+if(input.substr(peg$currPos,6)===peg$c25){
+s1=peg$c25;
+peg$currPos+=6;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c26);}
+}
+if(s1!==peg$FAILED){
+s2=peg$parse_();
+if(s2!==peg$FAILED){
+if(input.charCodeAt(peg$currPos)===44){
+s3=peg$c7;
+peg$currPos++;
+}else{
+s3=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c8);}
+}
+if(s3!==peg$FAILED){
+s4=peg$parse_();
+if(s4!==peg$FAILED){
+s5=[];
+s6=peg$parseoptionalFormatPattern();
+if(s6!==peg$FAILED){
+while(s6!==peg$FAILED){
+s5.push(s6);
+s6=peg$parseoptionalFormatPattern();
+}
+}else{
+s5=peg$FAILED;
+}
+if(s5!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c27(s5);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parseselector(){
+var s0,s1,s2,s3;
+
+s0=peg$currPos;
+s1=peg$currPos;
+if(input.charCodeAt(peg$currPos)===61){
+s2=peg$c28;
+peg$currPos++;
+}else{
+s2=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c29);}
+}
+if(s2!==peg$FAILED){
+s3=peg$parsenumber();
+if(s3!==peg$FAILED){
+s2=[s2,s3];
+s1=s2;
+}else{
+peg$currPos=s1;
+s1=peg$FAILED;
+}
+}else{
+peg$currPos=s1;
+s1=peg$FAILED;
+}
+if(s1!==peg$FAILED){
+s0=input.substring(s0,peg$currPos);
+}else{
+s0=s1;
+}
+if(s0===peg$FAILED){
+s0=peg$parsechars();
+}
+
+return s0;
+}
+
+function peg$parseoptionalFormatPattern(){
+var s0,s1,s2,s3,s4,s5,s6,s7,s8;
+
+s0=peg$currPos;
+s1=peg$parse_();
+if(s1!==peg$FAILED){
+s2=peg$parseselector();
+if(s2!==peg$FAILED){
+s3=peg$parse_();
+if(s3!==peg$FAILED){
+if(input.charCodeAt(peg$currPos)===123){
+s4=peg$c5;
+peg$currPos++;
+}else{
+s4=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c6);}
+}
+if(s4!==peg$FAILED){
+s5=peg$parse_();
+if(s5!==peg$FAILED){
+s6=peg$parsemessageFormatPattern();
+if(s6!==peg$FAILED){
+s7=peg$parse_();
+if(s7!==peg$FAILED){
+if(input.charCodeAt(peg$currPos)===125){
+s8=peg$c9;
+peg$currPos++;
+}else{
+s8=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c10);}
+}
+if(s8!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c30(s2,s6);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parseoffset(){
+var s0,s1,s2,s3;
+
+s0=peg$currPos;
+if(input.substr(peg$currPos,7)===peg$c31){
+s1=peg$c31;
+peg$currPos+=7;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c32);}
+}
+if(s1!==peg$FAILED){
+s2=peg$parse_();
+if(s2!==peg$FAILED){
+s3=peg$parsenumber();
+if(s3!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c33(s3);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parsepluralStyle(){
+var s0,s1,s2,s3,s4;
+
+s0=peg$currPos;
+s1=peg$parseoffset();
+if(s1===peg$FAILED){
+s1=null;
+}
+if(s1!==peg$FAILED){
+s2=peg$parse_();
+if(s2!==peg$FAILED){
+s3=[];
+s4=peg$parseoptionalFormatPattern();
+if(s4!==peg$FAILED){
+while(s4!==peg$FAILED){
+s3.push(s4);
+s4=peg$parseoptionalFormatPattern();
+}
+}else{
+s3=peg$FAILED;
+}
+if(s3!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c34(s1,s3);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+
+return s0;
+}
+
+function peg$parsews(){
+var s0,s1;
+
+peg$silentFails++;
+s0=[];
+if(peg$c36.test(input.charAt(peg$currPos))){
+s1=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c37);}
+}
+if(s1!==peg$FAILED){
+while(s1!==peg$FAILED){
+s0.push(s1);
+if(peg$c36.test(input.charAt(peg$currPos))){
+s1=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c37);}
+}
+}
+}else{
+s0=peg$FAILED;
+}
+peg$silentFails--;
+if(s0===peg$FAILED){
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c35);}
+}
+
+return s0;
+}
+
+function peg$parse_(){
+var s0,s1,s2;
+
+peg$silentFails++;
+s0=peg$currPos;
+s1=[];
+s2=peg$parsews();
+while(s2!==peg$FAILED){
+s1.push(s2);
+s2=peg$parsews();
+}
+if(s1!==peg$FAILED){
+s0=input.substring(s0,peg$currPos);
+}else{
+s0=s1;
+}
+peg$silentFails--;
+if(s0===peg$FAILED){
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c38);}
+}
+
+return s0;
+}
+
+function peg$parsedigit(){
+var s0;
+
+if(peg$c39.test(input.charAt(peg$currPos))){
+s0=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s0=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c40);}
+}
+
+return s0;
+}
+
+function peg$parsehexDigit(){
+var s0;
+
+if(peg$c41.test(input.charAt(peg$currPos))){
+s0=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s0=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c42);}
+}
+
+return s0;
+}
+
+function peg$parsenumber(){
+var s0,s1,s2,s3,s4,s5;
+
+s0=peg$currPos;
+if(input.charCodeAt(peg$currPos)===48){
+s1=peg$c43;
+peg$currPos++;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c44);}
+}
+if(s1===peg$FAILED){
+s1=peg$currPos;
+s2=peg$currPos;
+if(peg$c45.test(input.charAt(peg$currPos))){
+s3=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s3=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c46);}
+}
+if(s3!==peg$FAILED){
+s4=[];
+s5=peg$parsedigit();
+while(s5!==peg$FAILED){
+s4.push(s5);
+s5=peg$parsedigit();
+}
+if(s4!==peg$FAILED){
+s3=[s3,s4];
+s2=s3;
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+}else{
+peg$currPos=s2;
+s2=peg$FAILED;
+}
+if(s2!==peg$FAILED){
+s1=input.substring(s1,peg$currPos);
+}else{
+s1=s2;
+}
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c47(s1);
+}
+s0=s1;
+
+return s0;
+}
+
+function peg$parsechar(){
+var s0,s1,s2,s3,s4,s5,s6,s7;
+
+if(peg$c48.test(input.charAt(peg$currPos))){
+s0=input.charAt(peg$currPos);
+peg$currPos++;
+}else{
+s0=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c49);}
+}
+if(s0===peg$FAILED){
+s0=peg$currPos;
+if(input.substr(peg$currPos,2)===peg$c50){
+s1=peg$c50;
+peg$currPos+=2;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c51);}
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c52();
+}
+s0=s1;
+if(s0===peg$FAILED){
+s0=peg$currPos;
+if(input.substr(peg$currPos,2)===peg$c53){
+s1=peg$c53;
+peg$currPos+=2;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c54);}
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c55();
+}
+s0=s1;
+if(s0===peg$FAILED){
+s0=peg$currPos;
+if(input.substr(peg$currPos,2)===peg$c56){
+s1=peg$c56;
+peg$currPos+=2;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c57);}
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c58();
+}
+s0=s1;
+if(s0===peg$FAILED){
+s0=peg$currPos;
+if(input.substr(peg$currPos,2)===peg$c59){
+s1=peg$c59;
+peg$currPos+=2;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c60);}
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c61();
+}
+s0=s1;
+if(s0===peg$FAILED){
+s0=peg$currPos;
+if(input.substr(peg$currPos,2)===peg$c62){
+s1=peg$c62;
+peg$currPos+=2;
+}else{
+s1=peg$FAILED;
+if(peg$silentFails===0){peg$fail(peg$c63);}
+}
+if(s1!==peg$FAILED){
+s2=peg$currPos;
+s3=peg$currPos;
+s4=peg$parsehexDigit();
+if(s4!==peg$FAILED){
+s5=peg$parsehexDigit();
+if(s5!==peg$FAILED){
+s6=peg$parsehexDigit();
+if(s6!==peg$FAILED){
+s7=peg$parsehexDigit();
+if(s7!==peg$FAILED){
+s4=[s4,s5,s6,s7];
+s3=s4;
+}else{
+peg$currPos=s3;
+s3=peg$FAILED;
+}
+}else{
+peg$currPos=s3;
+s3=peg$FAILED;
+}
+}else{
+peg$currPos=s3;
+s3=peg$FAILED;
+}
+}else{
+peg$currPos=s3;
+s3=peg$FAILED;
+}
+if(s3!==peg$FAILED){
+s2=input.substring(s2,peg$currPos);
+}else{
+s2=s3;
+}
+if(s2!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c64(s2);
+s0=s1;
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}else{
+peg$currPos=s0;
+s0=peg$FAILED;
+}
+}
+}
+}
+}
+}
+
+return s0;
+}
+
+function peg$parsechars(){
+var s0,s1,s2;
+
+s0=peg$currPos;
+s1=[];
+s2=peg$parsechar();
+if(s2!==peg$FAILED){
+while(s2!==peg$FAILED){
+s1.push(s2);
+s2=peg$parsechar();
+}
+}else{
+s1=peg$FAILED;
+}
+if(s1!==peg$FAILED){
+peg$savedPos=s0;
+s1=peg$c65(s1);
+}
+s0=s1;
+
+return s0;
+}
+
+peg$result=peg$startRuleFunction();
+
+if(peg$result!==peg$FAILED&&peg$currPos===input.length){
+return peg$result;
+}else{
+if(peg$result!==peg$FAILED&&peg$currPos<input.length){
+peg$fail({type:"end",description:"end of input"});
+}
+
+throw peg$buildException(
+null,
+peg$maxFailExpected,
+peg$maxFailPos<input.length?input.charAt(peg$maxFailPos):null,
+peg$maxFailPos<input.length?
+peg$computeLocation(peg$maxFailPos,peg$maxFailPos+1):
+peg$computeLocation(peg$maxFailPos,peg$maxFailPos));
+
+}
+}
+
+return{
+SyntaxError:peg$SyntaxError,
+parse:peg$parse};
+
+}();
+
+
+},{}],168:[function(require,module,exports){
+
+
+'use strict';
+
+var IntlMessageFormat=require('./lib/main')['default'];
+
+
+
+require('./lib/locales');
+
+
+
+
+exports=module.exports=IntlMessageFormat;
+exports['default']=exports;
+
+},{"./lib/locales":104,"./lib/main":173}],169:[function(require,module,exports){
+
+
+
+
+
+
+
+
+"use strict";
+exports["default"]=Compiler;
+
+function Compiler(locales,formats,pluralFn){
+this.locales=locales;
+this.formats=formats;
+this.pluralFn=pluralFn;
+}
+
+Compiler.prototype.compile=function(ast){
+this.pluralStack=[];
+this.currentPlural=null;
+this.pluralNumberFormat=null;
+
+return this.compileMessage(ast);
+};
+
+Compiler.prototype.compileMessage=function(ast){
+if(!(ast&&ast.type==='messageFormatPattern')){
+throw new Error('Message AST is not of type: "messageFormatPattern"');
+}
+
+var elements=ast.elements,
+pattern=[];
+
+var i,len,element;
+
+for(i=0,len=elements.length;i<len;i+=1){
+element=elements[i];
+
+switch(element.type){
+case'messageTextElement':
+pattern.push(this.compileMessageText(element));
+break;
+
+case'argumentElement':
+pattern.push(this.compileArgument(element));
+break;
+
+default:
+throw new Error('Message element does not have a valid type');}
+
+}
+
+return pattern;
+};
+
+Compiler.prototype.compileMessageText=function(element){
+
+
+
+if(this.currentPlural&&/(^|[^\\])#/g.test(element.value)){
+
+
+if(!this.pluralNumberFormat){
+this.pluralNumberFormat=new Intl.NumberFormat(this.locales);
+}
+
+return new PluralOffsetString(
+this.currentPlural.id,
+this.currentPlural.format.offset,
+this.pluralNumberFormat,
+element.value);
+}
+
+
+return element.value.replace(/\\#/g,'#');
+};
+
+Compiler.prototype.compileArgument=function(element){
+var format=element.format;
+
+if(!format){
+return new StringFormat(element.id);
+}
+
+var formats=this.formats,
+locales=this.locales,
+pluralFn=this.pluralFn,
+options;
+
+switch(format.type){
+case'numberFormat':
+options=formats.number[format.style];
+return{
+id:element.id,
+format:new Intl.NumberFormat(locales,options).format};
+
+
+case'dateFormat':
+options=formats.date[format.style];
+return{
+id:element.id,
+format:new Intl.DateTimeFormat(locales,options).format};
+
+
+case'timeFormat':
+options=formats.time[format.style];
+return{
+id:element.id,
+format:new Intl.DateTimeFormat(locales,options).format};
+
+
+case'pluralFormat':
+options=this.compileOptions(element);
+return new PluralFormat(
+element.id,format.ordinal,format.offset,options,pluralFn);
+
+
+case'selectFormat':
+options=this.compileOptions(element);
+return new SelectFormat(element.id,options);
+
+default:
+throw new Error('Message element does not have a valid format type');}
+
+};
+
+Compiler.prototype.compileOptions=function(element){
+var format=element.format,
+options=format.options,
+optionsHash={};
+
+
+
+
+this.pluralStack.push(this.currentPlural);
+this.currentPlural=format.type==='pluralFormat'?element:null;
+
+var i,len,option;
+
+for(i=0,len=options.length;i<len;i+=1){
+option=options[i];
+
+
+optionsHash[option.selector]=this.compileMessage(option.value);
+}
+
+
+this.currentPlural=this.pluralStack.pop();
+
+return optionsHash;
+};
+
+
+
+function StringFormat(id){
+this.id=id;
+}
+
+StringFormat.prototype.format=function(value){
+if(!value&&typeof value!=='number'){
+return'';
+}
+
+return typeof value==='string'?value:String(value);
+};
+
+function PluralFormat(id,useOrdinal,offset,options,pluralFn){
+this.id=id;
+this.useOrdinal=useOrdinal;
+this.offset=offset;
+this.options=options;
+this.pluralFn=pluralFn;
+}
+
+PluralFormat.prototype.getOption=function(value){
+var options=this.options;
+
+var option=options['='+value]||
+options[this.pluralFn(value-this.offset,this.useOrdinal)];
+
+return option||options.other;
+};
+
+function PluralOffsetString(id,offset,numberFormat,string){
+this.id=id;
+this.offset=offset;
+this.numberFormat=numberFormat;
+this.string=string;
+}
+
+PluralOffsetString.prototype.format=function(value){
+var number=this.numberFormat.format(value-this.offset);
+
+return this.string.
+replace(/(^|[^\\])#/g,'$1'+number).
+replace(/\\#/g,'#');
+};
+
+function SelectFormat(id,options){
+this.id=id;
+this.options=options;
+}
+
+SelectFormat.prototype.getOption=function(value){
+var options=this.options;
+return options[value]||options.other;
+};
+
+
+},{}],170:[function(require,module,exports){
+
+
+
+
+
+
+
+
+"use strict";
+var src$utils$$=require("./utils"),src$es5$$=require("./es5"),src$compiler$$=require("./compiler"),intl$messageformat$parser$$=require("intl-messageformat-parser");
+exports["default"]=MessageFormat;
+
+
+
+function MessageFormat(message,locales,formats){
+
+var ast=typeof message==='string'?
+MessageFormat.__parse(message):message;
+
+if(!(ast&&ast.type==='messageFormatPattern')){
+throw new TypeError('A message must be provided as a String or AST.');
+}
+
+
+
+formats=this._mergeFormats(MessageFormat.formats,formats);
+
+
+src$es5$$.defineProperty(this,'_locale',{value:this._resolveLocale(locales)});
+
+
+
+
+var pluralFn=this._findPluralRuleFunction(this._locale);
+var pattern=this._compilePattern(ast,locales,formats,pluralFn);
+
+
+
+var messageFormat=this;
+this.format=function(values){
+try{
+return messageFormat._format(pattern,values);
+}catch(e){
+if(e.variableId){
+throw new Error(
+'The intl string context variable \''+e.variableId+'\''+
+' was not provided to the string \''+message+'\'');
+
+}else{
+throw e;
+}
+}
+};
+}
+
+
+
+
+src$es5$$.defineProperty(MessageFormat,'formats',{
+enumerable:true,
+
+value:{
+number:{
+'currency':{
+style:'currency'},
+
+
+'percent':{
+style:'percent'}},
+
+
+
+date:{
+'short':{
+month:'numeric',
+day:'numeric',
+year:'2-digit'},
+
+
+'medium':{
+month:'short',
+day:'numeric',
+year:'numeric'},
+
+
+'long':{
+month:'long',
+day:'numeric',
+year:'numeric'},
+
+
+'full':{
+weekday:'long',
+month:'long',
+day:'numeric',
+year:'numeric'}},
+
+
+
+time:{
+'short':{
+hour:'numeric',
+minute:'numeric'},
+
+
+'medium':{
+hour:'numeric',
+minute:'numeric',
+second:'numeric'},
+
+
+'long':{
+hour:'numeric',
+minute:'numeric',
+second:'numeric',
+timeZoneName:'short'},
+
+
+'full':{
+hour:'numeric',
+minute:'numeric',
+second:'numeric',
+timeZoneName:'short'}}}});
+
+
+
+
+
+
+src$es5$$.defineProperty(MessageFormat,'__localeData__',{value:src$es5$$.objCreate(null)});
+src$es5$$.defineProperty(MessageFormat,'__addLocaleData',{value:function(data){
+if(!(data&&data.locale)){
+throw new Error(
+'Locale data provided to IntlMessageFormat is missing a '+
+'`locale` property');
+
+}
+
+MessageFormat.__localeData__[data.locale.toLowerCase()]=data;
+}});
+
+
+src$es5$$.defineProperty(MessageFormat,'__parse',{value:intl$messageformat$parser$$["default"].parse});
+
+
+
+src$es5$$.defineProperty(MessageFormat,'defaultLocale',{
+enumerable:true,
+writable:true,
+value:undefined});
+
+
+MessageFormat.prototype.resolvedOptions=function(){
+
+return{
+locale:this._locale};
+
+};
+
+MessageFormat.prototype._compilePattern=function(ast,locales,formats,pluralFn){
+var compiler=new src$compiler$$["default"](locales,formats,pluralFn);
+return compiler.compile(ast);
+};
+
+MessageFormat.prototype._findPluralRuleFunction=function(locale){
+var localeData=MessageFormat.__localeData__;
+var data=localeData[locale.toLowerCase()];
+
+
+
+while(data){
+if(data.pluralRuleFunction){
+return data.pluralRuleFunction;
+}
+
+data=data.parentLocale&&localeData[data.parentLocale.toLowerCase()];
+}
+
+throw new Error(
+'Locale data added to IntlMessageFormat is missing a '+
+'`pluralRuleFunction` for :'+locale);
+
+};
+
+MessageFormat.prototype._format=function(pattern,values){
+var result='',
+i,len,part,id,value,err;
+
+for(i=0,len=pattern.length;i<len;i+=1){
+part=pattern[i];
+
+
+if(typeof part==='string'){
+result+=part;
+continue;
+}
+
+id=part.id;
+
+
+if(!(values&&src$utils$$.hop.call(values,id))){
+err=new Error('A value must be provided for: '+id);
+err.variableId=id;
+throw err;
+}
+
+value=values[id];
+
+
+
+
+if(part.options){
+result+=this._format(part.getOption(value),values);
+}else{
+result+=part.format(value);
+}
+}
+
+return result;
+};
+
+MessageFormat.prototype._mergeFormats=function(defaults,formats){
+var mergedFormats={},
+type,mergedType;
+
+for(type in defaults){
+if(!src$utils$$.hop.call(defaults,type)){continue;}
+
+mergedFormats[type]=mergedType=src$es5$$.objCreate(defaults[type]);
+
+if(formats&&src$utils$$.hop.call(formats,type)){
+src$utils$$.extend(mergedType,formats[type]);
+}
+}
+
+return mergedFormats;
+};
+
+MessageFormat.prototype._resolveLocale=function(locales){
+if(typeof locales==='string'){
+locales=[locales];
+}
+
+
+locales=(locales||[]).concat(MessageFormat.defaultLocale);
+
+var localeData=MessageFormat.__localeData__;
+var i,len,localeParts,data;
+
+
+
+
+
+
+for(i=0,len=locales.length;i<len;i+=1){
+localeParts=locales[i].toLowerCase().split('-');
+
+while(localeParts.length){
+data=localeData[localeParts.join('-')];
+if(data){
+
+
+return data.locale;
+}
+
+localeParts.pop();
+}
+}
+
+var defaultLocale=locales.pop();
+throw new Error(
+'No locale data has been added to IntlMessageFormat for: '+
+locales.join(', ')+', or the default locale: '+defaultLocale);
+
+};
+
+
+},{"./compiler":169,"./es5":172,"./utils":174,"intl-messageformat-parser":166}],171:[function(require,module,exports){
+
+"use strict";
+exports["default"]={"locale":"en","pluralRuleFunction":function(n,ord){var s=String(n).split("."),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?"one":n10==2&&n100!=12?"two":n10==3&&n100!=13?"few":"other";return n==1&&v0?"one":"other";}};
+
+
+},{}],172:[function(require,module,exports){
+
+
+
+
+
+
+
+
+"use strict";
+var src$utils$$=require("./utils");
+
+
+
+
+var realDefineProp=function(){
+try{return!!Object.defineProperty({},'a',{});}
+catch(e){return false;}
+}();
+
+var es3=!realDefineProp&&!Object.prototype.__defineGetter__;
+
+var defineProperty=realDefineProp?Object.defineProperty:
+function(obj,name,desc){
+
+if('get'in desc&&obj.__defineGetter__){
+obj.__defineGetter__(name,desc.get);
+}else if(!src$utils$$.hop.call(obj,name)||'value'in desc){
+obj[name]=desc.value;
+}
+};
+
+var objCreate=Object.create||function(proto,props){
+var obj,k;
+
+function F(){}
+F.prototype=proto;
+obj=new F();
+
+for(k in props){
+if(src$utils$$.hop.call(props,k)){
+defineProperty(obj,k,props[k]);
+}
+}
+
+return obj;
+};
+
+exports.defineProperty=defineProperty,exports.objCreate=objCreate;
+
+
+},{"./utils":174}],173:[function(require,module,exports){
+
+
+"use strict";
+var src$core$$=require("./core"),src$en$$=require("./en");
+
+src$core$$["default"].__addLocaleData(src$en$$["default"]);
+src$core$$["default"].defaultLocale='en';
+
+exports["default"]=src$core$$["default"];
+
+
+},{"./core":170,"./en":171}],174:[function(require,module,exports){
+
+
+
+
+
+
+
+
+"use strict";
+exports.extend=extend;
+var hop=Object.prototype.hasOwnProperty;
+
+function extend(obj){
+var sources=Array.prototype.slice.call(arguments,1),
+i,len,source,key;
+
+for(i=0,len=sources.length;i<len;i+=1){
+source=sources[i];
+if(!source){continue;}
+
+for(key in source){
+if(hop.call(source,key)){
+obj[key]=source[key];
+}
+}
+}
+
+return obj;
+}
+exports.hop=hop;
+
+
+},{}],175:[function(require,module,exports){
 var encode=require('./lib/encoder'),
 decode=require('./lib/decoder');
 
@@ -59664,7 +77630,7 @@
 decode:decode};
 
 
-},{"./lib/decoder":123,"./lib/encoder":124}],123:[function(require,module,exports){
+},{"./lib/decoder":176,"./lib/encoder":177}],176:[function(require,module,exports){
 (function(Buffer){
 
 
@@ -60654,7 +78620,7 @@
 }
 
 }).call(this,require("buffer").Buffer);
-},{"buffer":60}],124:[function(require,module,exports){
+},{"buffer":109}],177:[function(require,module,exports){
 (function(Buffer){
 
 
@@ -61424,223 +79390,7 @@
 }
 
 }).call(this,require("buffer").Buffer);
-},{"buffer":60}],125:[function(require,module,exports){
-(function(process){
-
-
-
-
-
-'use strict';
-
-const debug=require('debug');
-const EventEmitter=require('events').EventEmitter;
-const isWindows=process.platform==='win32';
-
-
-const isBrowser=process.browser;
-
-const colors={
-red:isBrowser?'crimson':1,
-yellow:isBrowser?'gold':3,
-cyan:isBrowser?'darkturquoise':6,
-green:isBrowser?'forestgreen':2,
-blue:isBrowser?'steelblue':4,
-magenta:isBrowser?'palevioletred':5};
-
-
-
-debug.colors=[colors.cyan,colors.green,colors.blue,colors.magenta];
-
-class Emitter extends EventEmitter{
-
-
-
-
-
-
-issueStatus(title,argsArray){
-if(title==='status'||title==='statusEnd'){
-this.emit(title,[title,...argsArray]);
-}
-}
-
-
-
-
-
-
-
-issueWarning(title,argsArray){
-this.emit('warning',[title,...argsArray]);
-}}
-
-
-const loggersByTitle={};
-const loggingBufferColumns=25;
-
-class Log{
-
-static _logToStdErr(title,argsArray){
-const log=Log.loggerfn(title);
-log(...argsArray);
-}
-
-static loggerfn(title){
-let log=loggersByTitle[title];
-if(!log){
-log=debug(title);
-loggersByTitle[title]=log;
-
-if(title.endsWith('error')){
-log.color=colors.red;
-}else if(title.endsWith('warn')){
-log.color=colors.yellow;
-}
-}
-return log;
-}
-
-static setLevel(level){
-switch(level){
-case'silent':
-debug.enable('-*');
-break;
-case'verbose':
-debug.enable('*');
-break;
-case'error':
-debug.enable('-*, *:error');
-break;
-default:
-debug.enable('*, -*:verbose');}
-
-}
-
-
-
-
-
-
-
-static formatProtocol(prefix,data,level){
-const columns=!process||process.browser?Infinity:process.stdout.columns;
-const method=data.method||'?????';
-const maxLength=columns-method.length-prefix.length-loggingBufferColumns;
-
-const snippet=data.params&&method!=='IO.read'?
-JSON.stringify(data.params).substr(0,maxLength):'';
-Log._logToStdErr(`${prefix}:${level||''}`,[method,snippet]);
-}
-
-static log(title,...args){
-Log.events.issueStatus(title,args);
-return Log._logToStdErr(title,args);
-}
-
-static warn(title,...args){
-Log.events.issueWarning(title,args);
-return Log._logToStdErr(`${title}:warn`,args);
-}
-
-static error(title,...args){
-return Log._logToStdErr(`${title}:error`,args);
-}
-
-static verbose(title,...args){
-Log.events.issueStatus(title,args);
-return Log._logToStdErr(`${title}:verbose`,args);
-}
-
-
-
-
-
-
-static greenify(str){
-return`${Log.green}${str}${Log.reset}`;
-}
-
-
-
-
-
-
-static redify(str){
-return`${Log.red}${str}${Log.reset}`;
-}
-
-static get green(){
-return'\x1B[32m';
-}
-
-static get red(){
-return'\x1B[31m';
-}
-
-static get yellow(){
-return'\x1b[33m';
-}
-
-static get purple(){
-return'\x1b[95m';
-}
-
-static get reset(){
-return'\x1B[0m';
-}
-
-static get bold(){
-return'\x1b[1m';
-}
-
-static get dim(){
-return'\x1b[2m';
-}
-
-static get tick(){
-return isWindows?'\u221A':'✓';
-}
-
-static get cross(){
-return isWindows?'\u00D7':'✘';
-}
-
-static get whiteSmallSquare(){
-return isWindows?'\u0387':'▫';
-}
-
-static get heavyHorizontal(){
-return isWindows?'\u2500':'━';
-}
-
-static get heavyVertical(){
-return isWindows?'\u2502 ':'┃ ';
-}
-
-static get heavyUpAndRight(){
-return isWindows?'\u2514':'┗';
-}
-
-static get heavyVerticalAndRight(){
-return isWindows?'\u251C':'┣';
-}
-
-static get heavyDownAndHorizontal(){
-return isWindows?'\u252C':'┳';
-}
-
-static get doubleLightHorizontal(){
-return'──';
-}}
-
-
-Log.events=new Emitter();
-
-module.exports=Log;
-
-}).call(this,require('_process'));
-},{"_process":77,"debug":116,"events":62}],126:[function(require,module,exports){
+},{"buffer":109}],178:[function(require,module,exports){
 (function(global){
 
 
@@ -63492,7 +81242,24 @@
 module.exports=isEqual;
 
 }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{}],127:[function(require,module,exports){
+},{}],179:[function(require,module,exports){
+
+
+
+module.exports=function lookupClosestLocale(locale,available){
+if(typeof locale==='string'&&available[locale])return locale;
+var locales=[].concat(locale||[]);
+for(var l=0,ll=locales.length;l<ll;++l){
+var current=locales[l].split('-');
+while(current.length){
+var candidate=current.join('-');
+if(available[candidate])return candidate;
+current.pop();
+}
+}
+};
+
+},{}],180:[function(require,module,exports){
 exports.getRenderingDataFromViewport=function(viewportProperties,uaDeviceWidth,uaDeviceHeight,uaMaxZoom,uaMinZoom){
 
 var vw=uaDeviceWidth/100;
@@ -63835,161 +81602,7 @@
 "viewport-fit":["auto","cover"]};
 
 
-},{}],128:[function(require,module,exports){
-
-
-
-
-var s=1000;
-var m=s*60;
-var h=m*60;
-var d=h*24;
-var y=d*365.25;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-module.exports=function(val,options){
-options=options||{};
-var type=typeof val;
-if(type==='string'&&val.length>0){
-return parse(val);
-}else if(type==='number'&&isNaN(val)===false){
-return options.long?fmtLong(val):fmtShort(val);
-}
-throw new Error(
-'val is not a non-empty string or a valid number. val='+
-JSON.stringify(val));
-
-};
-
-
-
-
-
-
-
-
-
-function parse(str){
-str=String(str);
-if(str.length>100){
-return;
-}
-var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
-str);
-
-if(!match){
-return;
-}
-var n=parseFloat(match[1]);
-var type=(match[2]||'ms').toLowerCase();
-switch(type){
-case'years':
-case'year':
-case'yrs':
-case'yr':
-case'y':
-return n*y;
-case'days':
-case'day':
-case'd':
-return n*d;
-case'hours':
-case'hour':
-case'hrs':
-case'hr':
-case'h':
-return n*h;
-case'minutes':
-case'minute':
-case'mins':
-case'min':
-case'm':
-return n*m;
-case'seconds':
-case'second':
-case'secs':
-case'sec':
-case's':
-return n*s;
-case'milliseconds':
-case'millisecond':
-case'msecs':
-case'msec':
-case'ms':
-return n;
-default:
-return undefined;}
-
-}
-
-
-
-
-
-
-
-
-
-function fmtShort(ms){
-if(ms>=d){
-return Math.round(ms/d)+'d';
-}
-if(ms>=h){
-return Math.round(ms/h)+'h';
-}
-if(ms>=m){
-return Math.round(ms/m)+'m';
-}
-if(ms>=s){
-return Math.round(ms/s)+'s';
-}
-return ms+'ms';
-}
-
-
-
-
-
-
-
-
-
-function fmtLong(ms){
-return plural(ms,d,'day')||
-plural(ms,h,'hour')||
-plural(ms,m,'minute')||
-plural(ms,s,'second')||
-ms+' ms';
-}
-
-
-
-
-
-function plural(ms,n,name){
-if(ms<n){
-return;
-}
-if(ms<n*1.5){
-return Math.floor(ms/n)+' '+name;
-}
-return Math.ceil(ms/n)+' '+name+'s';
-}
-
-},{}],129:[function(require,module,exports){
+},{}],181:[function(require,module,exports){
 module.exports=function parseCacheControl(field){
 
 if(typeof field!=='string'){
@@ -64028,7 +81641,7 @@
 return err?null:header;
 };
 
-},{}],130:[function(require,module,exports){
+},{}],182:[function(require,module,exports){
 var URL=require('url').URL;
 
 
@@ -64451,13 +82064,13 @@
 
 module.exports=Robots;
 
-},{"url":"url"}],131:[function(require,module,exports){
+},{"url":"url"}],183:[function(require,module,exports){
 var Robots=require('./Robots');
 
 module.exports=function(url,contents){
 return new Robots(url,contents);
 };
-},{"./Robots":130}],132:[function(require,module,exports){
+},{"./Robots":182}],184:[function(require,module,exports){
 (function(process){
 exports=module.exports=SemVer;
 
@@ -65664,27 +83277,48 @@
 }
 
 }).call(this,require('_process'));
-},{"_process":77}],133:[function(require,module,exports){
+},{"_process":126}],185:[function(require,module,exports){
 (function(Buffer){
 'use strict';
 
 
 const jpeg=require('jpeg-js');
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 function getPixel(x,y,channel,width,buff){
 return buff[(x+y*width)*4+channel];
 }
 
+
+
+
+
+
 function isWhitePixel(i,j,img){
 return getPixel(i,j,0,img.width,img.data)>=249&&
 getPixel(i,j,1,img.width,img.data)>=249&&
 getPixel(i,j,2,img.width,img.data)>=249;
 }
 
+
 function convertPixelsToHistogram(img){
 const createHistogramArray=function(){
-const ret=new Array(256);
-for(let i=0;i<ret.length;i++){
+const ret=[];
+for(let i=0;i<256;i++){
 ret[i]=0;
 }
 return ret;
@@ -65716,12 +83350,13 @@
 return histograms;
 }
 
+
 function synthesizeWhiteFrame(frames){
 const firstImageData=jpeg.decode(frames[0].getImage());
 const width=firstImageData.width;
 const height=firstImageData.height;
 
-const frameData=new Buffer(width*height*4);
+const frameData=Buffer.alloc(width*height*4);
 let i=0;
 while(i<frameData.length){
 frameData[i++]=0xFF;
@@ -65739,23 +83374,44 @@
 }
 
 const screenshotTraceCategory='disabled-by-default-devtools.screenshot';
+
+
+
+
+
 function extractFramesFromTimeline(timeline,opts){
 opts=opts||{};
+
 let trace;
-trace=typeof timeline==='string'?fs.readFileSync(timeline,'utf-8'):timeline;
+timeline=typeof timeline==='string'?fs.readFileSync(timeline,'utf-8'):timeline;
 try{
-trace=typeof trace==='string'?JSON.parse(trace):trace;
+trace=typeof timeline==='string'?JSON.parse(timeline):timeline;
 }catch(e){
 throw new Error('Speedline: Invalid JSON'+e.message);
 }
-let events=trace.traceEvents||trace;
-events=events.sort((a,b)=>a.ts-b.ts).filter(e=>e.ts!==0);
 
-const startTs=(opts.timeOrigin||events[0].ts)/1000;
-const endTs=events[events.length-1].ts/1000;
+let events=trace.traceEvents||trace;
+
+let startTs=Number.MAX_VALUE;
+let endTs=-Number.MAX_VALUE;
+events.forEach(e=>{
+if(e.ts===0){
+return;
+}
+
+startTs=Math.min(startTs,e.ts);
+endTs=Math.max(endTs,e.ts);
+});
+
+startTs=(opts.timeOrigin||startTs)/1000;
+endTs/=1000;
+
 
 let lastFrame=null;
 const rawScreenshots=events.filter(e=>e.cat.includes(screenshotTraceCategory)&&e.ts>=startTs*1000);
+rawScreenshots.sort((a,b)=>a.ts-b.ts);
+
+
 const uniqueFrames=rawScreenshots.map(function(evt){
 const base64img=evt.args&&evt.args.snapshot;
 const timestamp=evt.ts/1000;
@@ -65765,7 +83421,7 @@
 }
 
 lastFrame=base64img;
-const imgBuff=new Buffer(base64img,'base64');
+const imgBuff=Buffer.from(base64img,'base64');
 return frame(imgBuff,timestamp);
 }).filter(Boolean);
 
@@ -65784,12 +83440,23 @@
 return Promise.resolve(data);
 }
 
+
+
+
+
+
 function frame(imgBuff,ts){
+
 let _histogram=null;
+
 let _progress=null;
+
 let _isProgressInterpolated=null;
+
 let _perceptualProgress=null;
+
 let _isPerceptualProgressInterpolated=null;
+
 let _parsedImage=null;
 
 return{
@@ -65852,12 +83519,22 @@
 
 
 }).call(this,require("buffer").Buffer);
-},{"buffer":60,"jpeg-js":122}],134:[function(require,module,exports){
+},{"buffer":109,"jpeg-js":175}],186:[function(require,module,exports){
 'use strict';
 
 const frame=require('./frame');
 const speedIndex=require('./speed-index');
 
+
+
+
+
+
+
+
+
+
+
 function calculateValues(frames,data){
 const indexes=speedIndex.calculateSpeedIndexes(frames,data);
 const duration=Math.floor(data.endTs-data.startTs);
@@ -65876,6 +83553,7 @@
 
 }
 
+
 const Include={
 All:'all',
 pSI:'perceptualSpeedIndex',
@@ -65888,6 +83566,7 @@
 
 
 
+
 module.exports=function(timeline,opts){
 const include=opts&&opts.include||Include.All;
 
@@ -65910,7 +83589,7 @@
 });
 };
 
-},{"./frame":133,"./speed-index":135}],135:[function(require,module,exports){
+},{"./frame":185,"./speed-index":187}],187:[function(require,module,exports){
 'use strict';
 
 const imageSSIM=require('image-ssim');
@@ -65934,12 +83613,20 @@
 
 
 
+
+
+
 function calculateFastModeAllowableChange(elapsedTime){
 const elapsedTimeInSeconds=elapsedTime/1000;
 const allowableChange=fastModeMultiplier*Math.exp(fastModeExponentiationCoefficient*elapsedTimeInSeconds)+fastModeConstant;
 return allowableChange;
 }
 
+
+
+
+
+
 function calculateFrameProgress(current,initial,target){
 let total=0;
 let match=0;
@@ -65971,6 +83658,14 @@
 return progress;
 }
 
+
+
+
+
+
+
+
+
 function calculateProgressBetweenFrames(frames,lowerBound,upperBound,isFastMode,getProgress,setProgress){
 if(!isFastMode){
 frames.forEach(frame=>setProgress(frame,getProgress(frame),false));
@@ -65998,10 +83693,15 @@
 }
 }
 
+
+
+
+
 function calculateVisualProgress(frames,opts){
 const initial=frames[0];
 const target=frames[frames.length-1];
 
+
 function getProgress(frame){
 if(typeof frame.getProgress()==='number'){
 return frame.getProgress();
@@ -66010,6 +83710,11 @@
 return calculateFrameProgress(frame,initial,target);
 }
 
+
+
+
+
+
 function setProgress(frame,progress,isInterpolated){
 return frame.setProgress(progress,isInterpolated);
 }
@@ -66026,6 +83731,11 @@
 return frames;
 }
 
+
+
+
+
+
 function calculateFrameSimilarity(frame,target){
 const defaultImageConfig={
 
@@ -66040,11 +83750,16 @@
 return diff.ssim;
 }
 
+
+
+
+
 function calculatePerceptualProgress(frames,opts){
 const initial=frames[0];
 const target=frames[frames.length-1];
 const initialSimilarity=calculateFrameSimilarity(initial,target);
 
+
 function getProgress(frame){
 if(typeof frame.getPerceptualProgress()==='number'){
 return frame.getPerceptualProgress();
@@ -66054,6 +83769,11 @@
 return Math.max(100*(ssim-initialSimilarity)/(1-initialSimilarity),0);
 }
 
+
+
+
+
+
 function setProgress(frame,progress,isInterpolated){
 return frame.setPerceptualProgress(progress,isInterpolated);
 }
@@ -66070,12 +83790,18 @@
 return frames;
 }
 
+
+
+
+
+
 function calculateSpeedIndexes(frames,data){
 const hasVisualProgress=typeof frames[0].getProgress()==='number';
 const hasPerceptualProgress=typeof frames[0].getPerceptualProgress()==='number';
 const progressToUse=hasVisualProgress?'getProgress':'getPerceptualProgress';
 const startTs=data.startTs;
 let visuallyCompleteTs;
+
 let firstPaintTs;
 
 
@@ -66098,7 +83824,9 @@
 
 
 
+
 let speedIndex=firstPaintTs-startTs;
+
 let perceptualSpeedIndex=firstPaintTs-startTs;
 
 frames.forEach(function(frame){
@@ -66133,114 +83861,124 @@
 calculateSpeedIndexes};
 
 
-},{"image-ssim":121}],136:[function(require,module,exports){
+},{"image-ssim":165}],188:[function(require,module,exports){
 module.exports={
-"version":"3.0.3"};
+"version":"3.2.0"};
 
-},{}],137:[function(require,module,exports){
+},{}],189:[function(require,module,exports){
 module.exports={
 "npm":{
 "angular":[
-{"id":"npm:angular:20130621","severity":"medium","semver":{"vulnerable":["<=1.1.5"]}},
-{"id":"npm:angular:20130622","severity":"medium","semver":{"vulnerable":["<1.2.0 >=1.0.0"]}},
-{"id":"npm:angular:20130625","severity":"high","semver":{"vulnerable":["<1.1.5"]}},
-{"id":"npm:angular:20131113","severity":"high","semver":{"vulnerable":["<1.2.2"]}},
-{"id":"npm:angular:20140608","severity":"low","semver":{"vulnerable":["<1.3.0"]}},
-{"id":"npm:angular:20140908","severity":"medium","semver":{"vulnerable":["<1.3.0-rc.4"]}},
-{"id":"npm:angular:20140909","severity":"high","semver":{"vulnerable":["<1.2.24 >=1.2.19"]}},
-{"id":"npm:angular:20141104","severity":"medium","semver":{"vulnerable":["<1.3.2"]}},
-{"id":"npm:angular:20150310","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
-{"id":"npm:angular:20150315","severity":"medium","semver":{"vulnerable":["<1.6.1"]}},
-{"id":"npm:angular:20150807","severity":"high","semver":{"vulnerable":["<1.5.0-beta.0 >=1.0.0"]}},
-{"id":"npm:angular:20150807-1","severity":"medium","semver":{"vulnerable":["<1.5.0-beta.0 >=1.3.1"]}},
-{"id":"npm:angular:20150909","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
-{"id":"npm:angular:20151130","severity":"medium","semver":{"vulnerable":["<1.4.10"]}},
-{"id":"npm:angular:20151205","severity":"medium","semver":{"vulnerable":["<1.5.0-rc.0"]}},
-{"id":"npm:angular:20160122","severity":"medium","semver":{"vulnerable":["<1.5.0-rc.2 >=1.3.0"]}},
-{"id":"npm:angular:20160527","severity":"medium","semver":{"vulnerable":["<1.2.30 >=1.0.0"]}},
-{"id":"npm:angular:20161101","severity":"medium","semver":{"vulnerable":["<1.5.9 >=1.5.0"]}},
+{"id":"npm:angular:20180202","severity":"medium","semver":{"vulnerable":["<1.6.9"]}},
 {"id":"npm:angular:20171018","severity":"medium","semver":{"vulnerable":["<1.6.7"]}},
-{"id":"npm:angular:20180202","severity":"medium","semver":{"vulnerable":["<1.6.9"]}}],
+{"id":"npm:angular:20160527","severity":"medium","semver":{"vulnerable":["<1.2.30 >=1.0.0"]}},
+{"id":"npm:angular:20160122","severity":"medium","semver":{"vulnerable":["<1.5.0-rc.2 >=1.3.0"]}},
+{"id":"npm:angular:20140608","severity":"low","semver":{"vulnerable":["<1.3.0"]}},
+{"id":"npm:angular:20131113","severity":"high","semver":{"vulnerable":["<1.2.2"]}},
+{"id":"npm:angular:20140908","severity":"medium","semver":{"vulnerable":["<1.3.0-rc.4"]}},
+{"id":"npm:angular:20161101","severity":"medium","semver":{"vulnerable":["<1.5.9 >=1.5.0"]}},
+{"id":"npm:angular:20150909","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
+{"id":"npm:angular:20151205","severity":"medium","semver":{"vulnerable":["<1.5.0-rc.0"]}},
+{"id":"npm:angular:20151130","severity":"medium","semver":{"vulnerable":["<1.4.10"]}},
+{"id":"npm:angular:20130622","severity":"medium","semver":{"vulnerable":["<1.2.0 >=1.0.0"]}},
+{"id":"npm:angular:20150807-1","severity":"medium","semver":{"vulnerable":["<1.5.0-beta.0 >=1.3.1"]}},
+{"id":"npm:angular:20150807","severity":"high","semver":{"vulnerable":["<1.5.0-beta.0 >=1.0.0"]}},
+{"id":"npm:angular:20150315","severity":"medium","semver":{"vulnerable":["<1.6.1"]}},
+{"id":"npm:angular:20150310","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
+{"id":"npm:angular:20141104","severity":"medium","semver":{"vulnerable":["<1.3.2"]}},
+{"id":"npm:angular:20130621","severity":"medium","semver":{"vulnerable":["<=1.1.5"]}},
+{"id":"npm:angular:20140909","severity":"high","semver":{"vulnerable":["<1.2.24 >=1.2.19"]}},
+{"id":"npm:angular:20130625","severity":"high","semver":{"vulnerable":["<1.1.5"]}}],
 
 "backbone":[
-{"id":"npm:backbone:20110701","severity":"medium","semver":{"vulnerable":["<0.5.0"]}},
-{"id":"npm:backbone:20160523","severity":"medium","semver":{"vulnerable":["<= 0.3.3"]}}],
+{"id":"npm:backbone:20160523","severity":"medium","semver":{"vulnerable":["<= 0.3.3"]}},
+{"id":"npm:backbone:20110701","severity":"medium","semver":{"vulnerable":["<0.5.0"]}}],
 
 "bootstrap":[
-{"id":"npm:bootstrap:20120510","severity":"medium","semver":{"vulnerable":["<2.1.0"]}},
-{"id":"npm:bootstrap:20160627","severity":"medium","semver":{"vulnerable":["<3.4.0 || >=4.0.0-alpha <4.0.0-beta.2"]}}],
+{"id":"npm:bootstrap:20180529","severity":"medium","semver":{"vulnerable":[">=4.0.0 <4.1.2"]}},
+{"id":"npm:bootstrap:20160627","severity":"medium","semver":{"vulnerable":["<3.4.0 || >=4.0.0-alpha <4.0.0-beta.2"]}},
+{"id":"npm:bootstrap:20120510","severity":"medium","semver":{"vulnerable":["<2.1.0"]}}],
 
 "dojo":[
-{"id":"npm:dojo:20090409","severity":"medium","semver":{"vulnerable":["<1.1"]}},
-{"id":"npm:dojo:20100614","severity":"high","semver":{"vulnerable":[">=0.4 <0.4.4 || >=1.0 <1.0.3 || >=1.1 <1.1.2 || >=1.2 <1.2.4 || >=1.3 <1.3.3 || >=1.4 <1.4.2"]}},
+{"id":"SNYK-JS-DOJO-72305","severity":"medium","semver":{"vulnerable":["<1.14"]}},
+{"id":"npm:dojo:20180818","severity":"medium","semver":{"vulnerable":["<1.10.10 || >=1.11.0 <1.11.6 || >=1.12.0 <1.12.4 || >=1.13.0 <1.13.1"]}},
+{"id":"npm:dojo:20160523","severity":"medium","semver":{"vulnerable":["<= 1.0.0"]}},
 {"id":"npm:dojo:20100614-6","severity":"medium","semver":{"vulnerable":["<1.4.2"]}},
-{"id":"npm:dojo:20160523","severity":"medium","semver":{"vulnerable":["<= 1.0.0"]}}],
+{"id":"npm:dojo:20100614-1","severity":"high","semver":{"vulnerable":[">=0.4 <0.4.4 || >=1.0 <1.0.3 || >=1.1 <1.1.2 || >=1.2 <1.2.4 || >=1.3 <1.3.3 || >=1.4 <1.4.2"]}},
+{"id":"npm:dojo:20090409","severity":"medium","semver":{"vulnerable":["<1.1"]}}],
 
 "foundation-sites":[
-{"id":"npm:foundation-sites:20120717","severity":"medium","semver":{"vulnerable":["<3.0.6 >=3.0.0"]}},
+{"id":"npm:foundation-sites:20170802","severity":"medium","semver":{"vulnerable":["<6.0.0"]}},
 {"id":"npm:foundation-sites:20150619","severity":"medium","semver":{"vulnerable":["<5.5.3"]}},
-{"id":"npm:foundation-sites:20170802","severity":"medium","semver":{"vulnerable":["<6.0.0"]}}],
+{"id":"npm:foundation-sites:20120717","severity":"medium","semver":{"vulnerable":["<3.0.6 >=3.0.0"]}}],
 
 "handlebars":[
-{"id":"npm:handlebars:20110425","severity":"medium","semver":{"vulnerable":["<=1.0.0-beta.3"]}},
-{"id":"npm:handlebars:20151207","severity":"medium","semver":{"vulnerable":["<4.0.0"]}}],
+{"id":"npm:handlebars:20151207","severity":"medium","semver":{"vulnerable":["<4.0.0"]}},
+{"id":"npm:handlebars:20110425","severity":"medium","semver":{"vulnerable":["<=1.0.0-beta.3"]}}],
 
 "highcharts":[
-{"id":"npm:highcharts:20180225","severity":"low","semver":{"vulnerable":["<=6.0.7"]}}],
+{"id":"npm:highcharts:20180225","severity":"low","semver":{"vulnerable":["<6.1.0"]}}],
 
 "jquery":[
-{"id":"npm:jquery:20110606","severity":"medium","semver":{"vulnerable":["<1.6.3"]}},
-{"id":"npm:jquery:20120206","severity":"medium","semver":{"vulnerable":["<1.9.0 >=1.7.1"]}},
-{"id":"npm:jquery:20140902","severity":"medium","semver":{"vulnerable":["<=1.5.1 >=1.4.2"]}},
+{"id":"npm:jquery:20160529","severity":"low","semver":{"vulnerable":["=3.0.0-rc.1"]}},
 {"id":"npm:jquery:20150627","severity":"medium","semver":{"vulnerable":["<3.0.0-beta1 >1.12.3 || <1.12.0 >=1.4.0"]}},
-{"id":"npm:jquery:20160529","severity":"low","semver":{"vulnerable":["=3.0.0-rc.1"]}}],
+{"id":"npm:jquery:20140902","severity":"medium","semver":{"vulnerable":[">=1.4.2 <1.6.2"]}},
+{"id":"npm:jquery:20120206","severity":"medium","semver":{"vulnerable":["<1.9.0 >=1.7.1"]}},
+{"id":"npm:jquery:20110606","severity":"medium","semver":{"vulnerable":["<1.6.3"]}}],
 
 "jquery-mobile":[
 {"id":"npm:jquery-mobile:20120802","severity":"medium","semver":{"vulnerable":["<1.2.0"]}}],
 
 "jquery-ui":[
-{"id":"npm:jquery-ui:20100903","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
 {"id":"npm:jquery-ui:20121127","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
+{"id":"npm:jquery-ui:20100903","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
 {"id":"npm:jquery-ui:20160721","severity":"high","semver":{"vulnerable":["<=1.11.4"]}}],
 
 "knockout":[
-{"id":"npm:knockout:20130701","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.1.0-pre"]}},
-{"id":"npm:knockout:20180213","severity":"medium","semver":{"vulnerable":["<3.5.0-beta"]}}],
+{"id":"npm:knockout:20180213","severity":"medium","semver":{"vulnerable":["<3.5.0-beta"]}},
+{"id":"npm:knockout:20130701","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.1.0-pre"]}}],
 
 "lodash":[
 {"id":"npm:lodash:20180130","severity":"low","semver":{"vulnerable":["<4.17.5"]}}],
 
 "moment":[
-{"id":"npm:moment:20160126","severity":"low","semver":{"vulnerable":["<=2.11.1"]}},
+{"id":"npm:moment:20170905","severity":"low","semver":{"vulnerable":["<2.19.3"]}},
 {"id":"npm:moment:20161019","severity":"medium","semver":{"vulnerable":["<2.15.2"]}},
-{"id":"npm:moment:20170905","severity":"low","semver":{"vulnerable":["<2.19.3"]}}],
+{"id":"npm:moment:20160126","severity":"low","semver":{"vulnerable":["<=2.11.1"]}}],
 
 "mustache":[
-{"id":"npm:mustache:20110814","severity":"medium","semver":{"vulnerable":["< 0.3.1"]}},
-{"id":"npm:mustache:20151207","severity":"medium","semver":{"vulnerable":["<2.2.1"]}}],
+{"id":"npm:mustache:20151207","severity":"medium","semver":{"vulnerable":["<2.2.1"]}},
+{"id":"npm:mustache:20110814","severity":"medium","semver":{"vulnerable":["< 0.3.1"]}}],
+
+"preact-render-to-string":[
+{"id":"npm:preact-render-to-string:20180802","severity":"medium","semver":{"vulnerable":["<3.7.2"]}}],
 
 "react":[
-{"id":"npm:react:20131217","severity":"medium","semver":{"vulnerable":[">=0.5.0 <0.5.2 || >=0.4.0 <0.4.2"]}},
-{"id":"npm:react:20150318","severity":"high","semver":{"vulnerable":["<0.14.0"]}}],
+{"id":"npm:react:20150318","severity":"high","semver":{"vulnerable":["<0.14.0"]}},
+{"id":"npm:react:20131217","severity":"medium","semver":{"vulnerable":[">=0.5.0 <0.5.2 || >=0.4.0 <0.4.2"]}}],
+
+"react-dom":[
+{"id":"npm:react-dom:20180802","severity":"medium","semver":{"vulnerable":[">=16.0.0 <16.0.1",">=16.1.0 <16.1.2",">=16.2.0 <16.2.1",">=16.3.0 <16.3.3",">=16.4.0 <16.4.2"]}}],
 
 "riot":[
 {"id":"npm:riot:20131114","severity":"medium","semver":{"vulnerable":["<0.9.6"]}}],
 
 "socket.io":[
-{"id":"npm:socket.io:20120323","severity":"medium","semver":{"vulnerable":["<0.9.7"]}},
-{"id":"npm:socket.io:20120417","severity":"medium","semver":{"vulnerable":["<0.9.6"]}}],
+{"id":"npm:socket.io:20120417","severity":"medium","semver":{"vulnerable":["<0.9.6"]}},
+{"id":"npm:socket.io:20120323","severity":"medium","semver":{"vulnerable":["<0.9.7"]}}],
 
 "vue":[
-{"id":"npm:vue:20170401","severity":"medium","semver":{"vulnerable":["<2.3.0-beta.1"]}},
 {"id":"npm:vue:20170829","severity":"medium","semver":{"vulnerable":["<2.4.3"]}},
+{"id":"npm:vue:20170401","severity":"medium","semver":{"vulnerable":["<2.3.0-beta.1"]}},
+{"id":"npm:vue:20180802","severity":"medium","semver":{"vulnerable":["<2.5.17"]}},
 {"id":"npm:vue:20180222","severity":"low","semver":{"vulnerable":["<=2.5.14"]}}],
 
 "yui":[
-{"id":"npm:yui:20101025","severity":"medium","semver":{"vulnerable":["<2.8.2 >=2.4.0"]}},
-{"id":"npm:yui:20120428","severity":"medium","semver":{"vulnerable":["<3.5.1 >=3.5.0-PR1"]}},
-{"id":"npm:yui:20121030","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.4.0"]}},
+{"id":"npm:yui:20130604","severity":"medium","semver":{"vulnerable":[">=3.0.0 <3.10.1 || =3.10.2"]}},
 {"id":"npm:yui:20130515","severity":"medium","semver":{"vulnerable":["<3.10.0 >=3.0.0"]}},
-{"id":"npm:yui:20130604","severity":"medium","semver":{"vulnerable":[">=3.0.0 <3.10.1 || =3.10.2"]}}]}};
+{"id":"npm:yui:20121030","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.4.0"]}},
+{"id":"npm:yui:20120428","severity":"medium","semver":{"vulnerable":["<3.5.1 >=3.5.0-PR1"]}},
+{"id":"npm:yui:20101025","severity":"medium","semver":{"vulnerable":["<2.8.2 >=2.4.0"]}}]}};
 
 
 
@@ -66271,6 +84009,11 @@
 'web','spb','blog','jus','kiev','mil','wi','qc','ca','bel','on'];
 
 
+const allowedProtocols=[
+'https:','http:','chrome:'];
+
+
+
 
 
 
@@ -66430,6 +84173,20 @@
 }catch(e){
 return false;
 }
+}
+
+
+
+
+
+
+static isProtocolAllowed(url){
+try{
+const parsed=new URL(url);
+return allowedProtocols.includes(parsed.protocol);
+}catch(e){
+return false;
+}
 }}
 
 
@@ -66445,4 +84202,4 @@
 
 module.exports=URLShim;
 
-},{"../report/html/renderer/util.js":48,"url":"url"}]},{},[52]);
\ No newline at end of file
+},{"../report/html/renderer/util.js":97,"url":"url"}]},{},[101]);
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js b/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js
index fcb2c36..4b043754 100644
--- a/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js
+++ b/third_party/blink/renderer/devtools/front_end/help/ReleaseNoteText.js
@@ -13,6 +13,34 @@
 /** @type {!Array<!Help.ReleaseNote>} */
 Help.releaseNoteText = [
   {
+    version: 13,
+    header: 'Highlights from the Chrome 71 update',
+    highlights: [
+      {
+        title: 'Hover over a Live Expression to highlight a DOM node',
+        subtitle: 'Hover over a result that evaluates to a node to highlight that node in the viewport.',
+        link: 'https://developers.google.com/web/updates/2018/10/devtools#hover',
+      },
+      {
+        title: 'Store DOM nodes as global variables',
+        subtitle: 'Right-click a node in the Elements panel or Console and select "Store as global variable".',
+        link: 'https://developers.google.com/web/updates/2018/10/devtools#store',
+      },
+      {
+        title: 'Initiator and priority information now in HAR imports and exports',
+        subtitle:
+            'Get more context around what caused a resource to be requested and what priority the browser assigned to each resource when sharing network logs.',
+        link: 'https://developers.google.com/web/updates/2018/10/devtools#HAR',
+      },
+      {
+        title: 'Access the Command Menu from the Main Menu',
+        subtitle: 'Open the Main Menu and select "Run command".',
+        link: 'https://developers.google.com/web/updates/2018/10/devtools#command-menu',
+      },
+    ],
+    link: 'https://developers.google.com/web/updates/2018/10/devtools',
+  },
+  {
     version: 12,
     header: 'Highlights from the Chrome 70 update',
     highlights: [
diff --git a/third_party/blink/renderer/devtools/front_end/inspector_main/module.json b/third_party/blink/renderer/devtools/front_end/inspector_main/module.json
index b481f55..35ad608 100644
--- a/third_party/blink/renderer/devtools/front_end/inspector_main/module.json
+++ b/third_party/blink/renderer/devtools/front_end/inspector_main/module.json
@@ -133,7 +133,7 @@
             "category": "Mobile",
             "actionId": "components.request-app-banner",
             "className": "InspectorMain.RequestAppBannerActionDelegate",
-            "title": "Trigger beforeinstallprompt"
+            "title": "Add to homescreen"
         }
     ],
     "dependencies": [
diff --git a/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js b/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js
index 070da96..6057f58 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js
+++ b/third_party/blink/renderer/devtools/front_end/resources/AppManifestView.js
@@ -14,10 +14,8 @@
     const p = this._emptyView.appendParagraph();
     const linkElement = UI.XLink.create(
         'https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/?utm_source=devtools',
-        Common.UIString('Read more about the web app manifest'));
-    p.appendChild(UI.formatLocalized(
-        'A web app manifest allows you to control how your app behaves when launched and displayed to the user. %s',
-        [linkElement]));
+        Common.UIString('Read more about the web manifest'));
+    p.appendChild(UI.formatLocalized('A web manifest allows you to control how your app behaves when launched and displayed to the user. %s', [linkElement]));
 
     this._emptyView.show(this.contentElement);
     this._emptyView.hideWidget();
@@ -30,10 +28,10 @@
     this._identitySection = this._reportView.appendSection(Common.UIString('Identity'));
     const toolbar = this._identitySection.createToolbar();
     toolbar.renderAsLinks();
-    const triggerBeforeInstallPrompt = new UI.ToolbarButton(
-        Common.UIString('Trigger beforeinstallprompt'), undefined, Common.UIString('Trigger beforeinstallprompt'));
-    triggerBeforeInstallPrompt.addEventListener(UI.ToolbarButton.Events.Click, this._triggerBeforeInstallPrompt, this);
-    toolbar.appendToolbarItem(triggerBeforeInstallPrompt);
+    const addToHomeScreen =
+        new UI.ToolbarButton(Common.UIString('Add to homescreen'), undefined, Common.UIString('Add to homescreen'));
+    addToHomeScreen.addEventListener(UI.ToolbarButton.Events.Click, this._addToHomescreen, this);
+    toolbar.appendToolbarItem(addToHomeScreen);
 
     this._presentationSection = this._reportView.appendSection(Common.UIString('Presentation'));
     this._iconsSection = this._reportView.appendSection(Common.UIString('Icons'));
@@ -159,7 +157,7 @@
   /**
    * @param {!Common.Event} event
    */
-  _triggerBeforeInstallPrompt(event) {
+  _addToHomescreen(event) {
     const target = SDK.targetManager.mainTarget();
     if (target && target.hasBrowserCapability()) {
       target.pageAgent().requestAppBanner();
diff --git a/third_party/blink/renderer/devtools/front_end/worker_service/ServiceDispatcher.js b/third_party/blink/renderer/devtools/front_end/worker_service/ServiceDispatcher.js
index cee212ef..a975d8e 100644
--- a/third_party/blink/renderer/devtools/front_end/worker_service/ServiceDispatcher.js
+++ b/third_party/blink/renderer/devtools/front_end/worker_service/ServiceDispatcher.js
@@ -38,8 +38,8 @@
    * @param {string} data
    */
   _dispatchMessageWrapped(data) {
+    const message = JSON.parse(data);
     try {
-      const message = JSON.parse(data);
       if (!(message instanceof Object)) {
         this._sendErrorResponse(message['id'], 'Malformed message');
         return;
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc
index 7b528d3..d679d4d 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc
@@ -55,7 +55,7 @@
 
 void AnimationWorkletThread::EnsureSharedBackingThread() {
   WorkletThreadHolder<AnimationWorkletThread>::EnsureInstance(
-      WebThreadCreationParams(WebThreadType::kAnimationWorkletThread));
+      ThreadCreationParams(WebThreadType::kAnimationWorkletThread));
 }
 
 void AnimationWorkletThread::ClearSharedBackingThread() {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
index 3884f42..722fa6d6 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
@@ -558,15 +558,14 @@
     key_type_histogram.Count(static_cast<int>(key->GetType()));
   }
 
-  Vector<int64_t> index_ids;
-  WebVector<WebVector<WebIDBKey>> index_keys;
+  WebVector<WebIDBIndexKeys> index_keys;
   index_keys.reserve(Metadata().indexes.size());
   for (const auto& it : Metadata().indexes) {
     if (clone.IsEmpty())
       value_wrapper.Clone(script_state, &clone);
-    index_ids.push_back(it.key);
-    index_keys.emplace_back(GenerateIndexKeysForValue(
-        script_state->GetIsolate(), *it.value, clone));
+    index_keys.emplace_back(
+        it.key, GenerateIndexKeysForValue(script_state->GetIsolate(), *it.value,
+                                          clone));
   }
   // Records 1KB to 1GB.
   UMA_HISTOGRAM_COUNTS_1M(
@@ -587,8 +586,7 @@
       transaction_->Id(), Id(), WebData(value_wrapper.TakeWireBytes()),
       value_wrapper.TakeBlobInfo(), WebIDBKeyView(key),
       static_cast<WebIDBPutMode>(put_mode),
-      request->CreateWebCallbacks().release(), index_ids,
-      WebVector<WebIDBDatabase::WebIndexKeys>(std::move(index_keys)));
+      request->CreateWebCallbacks().release(), std::move(index_keys));
 
   return request;
 }
@@ -749,8 +747,6 @@
     if (cursor_any->GetType() == IDBAny::kIDBCursorWithValueType)
       cursor = cursor_any->IdbCursorWithValue();
 
-    Vector<int64_t> index_ids;
-    index_ids.push_back(IndexMetadata().id);
     if (cursor && !cursor->IsDeleted()) {
       cursor->Continue(nullptr, nullptr, IDBRequest::AsyncTraceState(),
                        ASSERT_NO_EXCEPTION);
@@ -758,18 +754,21 @@
       const IDBKey* primary_key = cursor->IdbPrimaryKey();
       ScriptValue value = cursor->value(script_state_);
 
-      WebVector<WebVector<WebIDBKey>> index_keys_list;
-      index_keys_list.reserve(1);
-      index_keys_list.emplace_back(GenerateIndexKeysForValue(
-          script_state_->GetIsolate(), IndexMetadata(), value));
+      WebVector<WebIDBIndexKeys> index_keys;
+      index_keys.reserve(1);
+      index_keys.emplace_back(
+          IndexMetadata().id,
+          GenerateIndexKeysForValue(script_state_->GetIsolate(),
+                                    IndexMetadata(), value));
 
-      database_->Backend()->SetIndexKeys(
-          transaction_id_, object_store_id_, WebIDBKeyView(primary_key),
-          index_ids,
-          WebVector<WebIDBDatabase::WebIndexKeys>(std::move(index_keys_list)));
+      database_->Backend()->SetIndexKeys(transaction_id_, object_store_id_,
+                                         WebIDBKeyView(primary_key),
+                                         std::move(index_keys));
     } else {
       // Now that we are done indexing, tell the backend to go
       // back to processing tasks of type NormalTask.
+      Vector<int64_t> index_ids;
+      index_ids.push_back(IndexMetadata().id);
       database_->Backend()->SetIndexesReady(transaction_id_, object_store_id_,
                                             index_ids);
       database_.Clear();
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h
index 0aac12d..a7325498 100644
--- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h
+++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_database.h
@@ -84,7 +84,7 @@
                     bool key_only,
                     WebIDBCallbacks*));
 
-  MOCK_METHOD9(Put,
+  MOCK_METHOD8(Put,
                void(long long transaction_id,
                     long long object_store_id,
                     const WebData& value,
@@ -92,15 +92,13 @@
                     WebIDBKeyView primary_key,
                     WebIDBPutMode,
                     WebIDBCallbacks*,
-                    const WebVector<long long>& index_ids,
-                    const WebVector<WebIndexKeys>));
+                    const WebVector<WebIDBIndexKeys>&));
 
-  MOCK_METHOD5(SetIndexKeys,
+  MOCK_METHOD4(SetIndexKeys,
                void(long long transaction_id,
                     long long object_store_id,
                     WebIDBKeyView primary_key,
-                    const WebVector<long long>& index_ids,
-                    const WebVector<WebIndexKeys>&));
+                    const WebVector<WebIDBIndexKeys>&));
   MOCK_METHOD3(SetIndexesReady,
                void(long long transaction_id,
                     long long object_store_id,
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
index dca963b..fe216c25 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
@@ -222,16 +222,21 @@
 
 P2PQuicStreamImpl* P2PQuicTransportImpl::CreateStream() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  return CreateOutgoingDynamicStream();
+  return CreateOutgoingBidirectionalStream();
 }
 
-P2PQuicStreamImpl* P2PQuicTransportImpl::CreateOutgoingDynamicStream() {
+P2PQuicStreamImpl* P2PQuicTransportImpl::CreateOutgoingBidirectionalStream() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   P2PQuicStreamImpl* stream = CreateStreamInternal(GetNextOutgoingStreamId());
   ActivateStream(std::unique_ptr<P2PQuicStreamImpl>(stream));
   return stream;
 }
 
+P2PQuicStreamImpl* P2PQuicTransportImpl::CreateOutgoingUnidirectionalStream() {
+  DCHECK(false);
+  return nullptr;
+}
+
 P2PQuicStreamImpl* P2PQuicTransportImpl::CreateIncomingDynamicStream(
     quic::QuicStreamId id) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h
index 75372c7..609f223c 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h
@@ -110,7 +110,8 @@
   // Creates a new outgoing stream. The caller does not own the
   // stream, so the stream is activated and ownership is moved to the
   // quic::QuicSession.
-  P2PQuicStreamImpl* CreateOutgoingDynamicStream() override;
+  P2PQuicStreamImpl* CreateOutgoingBidirectionalStream() override;
+  P2PQuicStreamImpl* CreateOutgoingUnidirectionalStream() override;
 
   void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override;
 
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc
index 619e6d4..2c41d7c 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_installed_scripts_manager_test.cc
@@ -123,10 +123,10 @@
  public:
   ServiceWorkerInstalledScriptsManagerTest()
       : io_thread_(Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
+            ThreadCreationParams(WebThreadType::kTestThread)
                 .SetThreadNameForTest("io thread"))),
         worker_thread_(Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
+            ThreadCreationParams(WebThreadType::kTestThread)
                 .SetThreadNameForTest("worker thread"))) {}
 
  protected:
@@ -182,8 +182,8 @@
     waiter->Signal();
   }
 
-  std::unique_ptr<WebThread> io_thread_;
-  std::unique_ptr<WebThread> worker_thread_;
+  std::unique_ptr<Thread> io_thread_;
+  std::unique_ptr<Thread> worker_thread_;
 
   WaitableEvent worker_waiter_;
 
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc b/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc
index 1cec9017..338ac09 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc
@@ -47,8 +47,8 @@
     mojom::blink::CacheStoragePtrInfo cache_storage_info)
     : WorkerThread(*global_scope_proxy),
       global_scope_proxy_(global_scope_proxy),
-      worker_backing_thread_(WorkerBackingThread::Create(
-          WebThreadCreationParams(GetThreadType()))),
+      worker_backing_thread_(
+          WorkerBackingThread::Create(ThreadCreationParams(GetThreadType()))),
       installed_scripts_manager_(std::move(installed_scripts_manager)),
       cache_storage_info_(std::move(cache_storage_info)) {}
 
diff --git a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc
index 83df7910..b04d2a841 100644
--- a/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc
+++ b/third_party/blink/renderer/modules/service_worker/thread_safe_script_container_test.cc
@@ -24,10 +24,10 @@
  public:
   ThreadSafeScriptContainerTest()
       : writer_thread_(Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
+            ThreadCreationParams(WebThreadType::kTestThread)
                 .SetThreadNameForTest("writer_thread"))),
         reader_thread_(Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
+            ThreadCreationParams(WebThreadType::kTestThread)
                 .SetThreadNameForTest("reader_thread"))),
         container_(base::MakeRefCounted<ThreadSafeScriptContainer>()) {}
 
@@ -112,8 +112,8 @@
   }
 
  private:
-  std::unique_ptr<WebThread> writer_thread_;
-  std::unique_ptr<WebThread> reader_thread_;
+  std::unique_ptr<Thread> writer_thread_;
+  std::unique_ptr<Thread> reader_thread_;
 
   WaitableEvent writer_waiter_;
   WaitableEvent reader_waiter_;
diff --git a/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc b/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc
index 254b65a..c8dbc314 100644
--- a/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc
+++ b/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc
@@ -82,9 +82,8 @@
             // Pass a temporary task runner to ensure
             // ServiceWorkerInstalledScriptsManager construction succeeds.
             Platform::Current()
-                ->CreateThread(
-                    WebThreadCreationParams(WebThreadType::kTestThread)
-                        .SetThreadNameForTest("io thread"))
+                ->CreateThread(ThreadCreationParams(WebThreadType::kTestThread)
+                                   .SetThreadNameForTest("io thread"))
                 ->GetTaskRunner()){};
   MOCK_CONST_METHOD1(IsScriptInstalled, bool(const KURL& script_url));
   MOCK_METHOD1(GetRawScriptData,
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc
index da8438b..6195e9cf 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc
@@ -55,7 +55,7 @@
 void AudioWorkletThread::EnsureSharedBackingThread() {
   DCHECK(IsMainThread());
   WorkletThreadHolder<AudioWorkletThread>::EnsureInstance(
-      WebThreadCreationParams(blink::WebThreadType::kWebAudioThread));
+      ThreadCreationParams(WebThreadType::kWebAudioThread));
 }
 
 void AudioWorkletThread::ClearSharedBackingThread() {
diff --git a/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.cc b/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.cc
index 673121b..fd5e12d5 100644
--- a/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.cc
@@ -373,7 +373,7 @@
     if (!render_thread_) {
       // The context started from the non-AudioWorklet mode.
       render_thread_ = Platform::Current()->CreateThread(
-          WebThreadCreationParams(WebThreadType::kOfflineAudioRenderThread));
+          ThreadCreationParams(WebThreadType::kOfflineAudioRenderThread));
       render_thread_task_runner_ = render_thread_->GetTaskRunner();
     }
   }
diff --git a/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.h b/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.h
index fa4c56b..dc658d2 100644
--- a/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.h
+++ b/third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.h
@@ -145,7 +145,7 @@
 
   // The rendering thread for the non-AudioWorklet mode. For the AudioWorklet
   // node, AudioWorkletThread will drive the rendering.
-  std::unique_ptr<WebThread> render_thread_;
+  std::unique_ptr<Thread> render_thread_;
 
   scoped_refptr<base::SingleThreadTaskRunner> render_thread_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
diff --git a/third_party/blink/renderer/modules/webdatabase/database_thread.cc b/third_party/blink/renderer/modules/webdatabase/database_thread.cc
index ae8cb7d..554d541 100644
--- a/third_party/blink/renderer/modules/webdatabase/database_thread.cc
+++ b/third_party/blink/renderer/modules/webdatabase/database_thread.cc
@@ -60,7 +60,7 @@
   if (thread_)
     return;
   thread_ = WebThreadSupportingGC::Create(
-      WebThreadCreationParams(WebThreadType::kDatabaseThread));
+      ThreadCreationParams(WebThreadType::kDatabaseThread));
   thread_->PostTask(FROM_HERE,
                     CrossThreadBind(&DatabaseThread::SetupDatabaseThread,
                                     WrapCrossThreadPersistent(this)));
@@ -86,7 +86,7 @@
                                       WrapCrossThreadPersistent(this)));
   }
   sync.Wait();
-  // The WebThread destructor blocks until all the tasks of the database
+  // The Thread destructor blocks until all the tasks of the database
   // thread are processed. However, it shouldn't block at all because
   // the database thread has already finished processing the cleanup task.
   thread_.reset();
@@ -171,7 +171,7 @@
     DCHECK(!termination_requested_);
   }
 #endif
-  // WebThread takes ownership of the task.
+  // Thread takes ownership of the task.
   thread_->PostTask(FROM_HERE,
                     CrossThreadBind(&DatabaseTask::Run, std::move(task)));
 }
diff --git a/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc b/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc
index ef2ca35..51b93a03 100644
--- a/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc
+++ b/third_party/blink/renderer/platform/audio/hrtf_database_loader.cc
@@ -95,7 +95,7 @@
 
   // Start the asynchronous database loading process.
   thread_ = Platform::Current()->CreateThread(
-      WebThreadCreationParams(WebThreadType::kHRTFDatabaseLoaderThread));
+      ThreadCreationParams(WebThreadType::kHRTFDatabaseLoaderThread));
   // TODO(alexclarke): Should this be posted as a loading task?
   PostCrossThreadTask(*thread_->GetTaskRunner(), FROM_HERE,
                       CrossThreadBind(&HRTFDatabaseLoader::LoadTask,
diff --git a/third_party/blink/renderer/platform/audio/hrtf_database_loader.h b/third_party/blink/renderer/platform/audio/hrtf_database_loader.h
index eb5115b..d1ac9dc 100644
--- a/third_party/blink/renderer/platform/audio/hrtf_database_loader.h
+++ b/third_party/blink/renderer/platform/audio/hrtf_database_loader.h
@@ -88,7 +88,7 @@
   Mutex lock_;
   std::unique_ptr<HRTFDatabase> hrtf_database_;
 
-  std::unique_ptr<WebThread> thread_;
+  std::unique_ptr<Thread> thread_;
 
   float database_sample_rate_;
 };
diff --git a/third_party/blink/renderer/platform/audio/push_pull_fifo_multithread_test.cc b/third_party/blink/renderer/platform/audio/push_pull_fifo_multithread_test.cc
index d1dfae47b..049cc6b 100644
--- a/third_party/blink/renderer/platform/audio/push_pull_fifo_multithread_test.cc
+++ b/third_party/blink/renderer/platform/audio/push_pull_fifo_multithread_test.cc
@@ -29,7 +29,7 @@
       : fifo_(fifo),
         bus_(AudioBus::Create(fifo->NumberOfChannels(), bus_length)),
         client_thread_(Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
+            ThreadCreationParams(WebThreadType::kTestThread)
                 .SetThreadNameForTest("FIFOClientThread"))),
         done_event_(std::make_unique<WaitableEvent>()),
         jitter_range_ms_(jitter_range_ms) {}
@@ -76,7 +76,7 @@
 
   PushPullFIFO* fifo_;
   scoped_refptr<AudioBus> bus_;
-  std::unique_ptr<WebThread> client_thread_;
+  std::unique_ptr<Thread> client_thread_;
   std::unique_ptr<WaitableEvent> done_event_;
 
   // Test duration.
@@ -181,40 +181,40 @@
 }
 
 FIFOSmokeTestParam smoke_test_params[] = {
-  // Test case 0 (OSX): 256 Pull, 128 Push, Minimal jitter.
-  // WebThread's priority is lower than the device thread, so its jitter range
-  // is slightly bigger than the other.
-  {48000, 2, 8192, 250, 256, 1, 128, 2},
+    // Test case 0 (OSX): 256 Pull, 128 Push, Minimal jitter.
+    // Thread's priority is lower than the device thread, so its jitter range
+    // is slightly bigger than the other.
+    {48000, 2, 8192, 250, 256, 1, 128, 2},
 
-  // Test case 1 (Windows): 441 Pull, 128 Push. Moderate Jitter.
-  // Windows' audio callback is known to be ~10ms and UMA data shows the
-  // evidence for it. The jitter range was determined speculatively.
-  {44100, 2, 8192, 250, 441, 2, 128, 3},
+    // Test case 1 (Windows): 441 Pull, 128 Push. Moderate Jitter.
+    // Windows' audio callback is known to be ~10ms and UMA data shows the
+    // evidence for it. The jitter range was determined speculatively.
+    {44100, 2, 8192, 250, 441, 2, 128, 3},
 
-  // Test case 2 (Ubuntu/Linux): 512 Pull, 128 Push. Unstable callback, but
-  // fast CPU. A typical configuration for Ubuntu + PulseAudio setup.
-  // PulseAudio's callback is known to be rather unstable.
-  {48000, 2, 8192, 250, 512, 8, 128, 1},
+    // Test case 2 (Ubuntu/Linux): 512 Pull, 128 Push. Unstable callback, but
+    // fast CPU. A typical configuration for Ubuntu + PulseAudio setup.
+    // PulseAudio's callback is known to be rather unstable.
+    {48000, 2, 8192, 250, 512, 8, 128, 1},
 
-  // Test case 3 (Android-Reference): 512 Pull, 128 Push. Similar to Linux, but
-  // low profile CPU.
-  {44100, 2, 8192, 250, 512, 8, 128, 3},
+    // Test case 3 (Android-Reference): 512 Pull, 128 Push. Similar to Linux,
+    // but
+    // low profile CPU.
+    {44100, 2, 8192, 250, 512, 8, 128, 3},
 
-  // Test case 4 (Android-ExternalA): 441 Pull, 128 Push. Extreme jitter with
-  // low profile CPU.
-  {44100, 2, 8192, 250, 441, 24, 128, 8},
+    // Test case 4 (Android-ExternalA): 441 Pull, 128 Push. Extreme jitter with
+    // low profile CPU.
+    {44100, 2, 8192, 250, 441, 24, 128, 8},
 
-  // Test case 5 (Android-ExternalB): 5768 Pull, 128 Push. Huge callback with
-  // large jitter. Low profile CPU.
-  {44100, 2, 8192, 250, 5768, 120, 128, 12},
+    // Test case 5 (Android-ExternalB): 5768 Pull, 128 Push. Huge callback with
+    // large jitter. Low profile CPU.
+    {44100, 2, 8192, 250, 5768, 120, 128, 12},
 
-  // Test case 6 (User-specified buffer size): 960 Pull, 128 Push. Minimal
-  // Jitter. 960 frames = 20ms at 48KHz.
-  {48000, 2, 8192, 250, 960, 1, 128, 1},
+    // Test case 6 (User-specified buffer size): 960 Pull, 128 Push. Minimal
+    // Jitter. 960 frames = 20ms at 48KHz.
+    {48000, 2, 8192, 250, 960, 1, 128, 1},
 
-  // Test case 7 (Longer test duration): 256 Pull, 128 Push. 2.5 seconds.
-  {48000, 2, 8192, 2500, 256, 0, 128, 1}
-};
+    // Test case 7 (Longer test duration): 256 Pull, 128 Push. 2.5 seconds.
+    {48000, 2, 8192, 2500, 256, 0, 128, 1}};
 
 INSTANTIATE_TEST_CASE_P(PushPullFIFOSmokeTest,
                         PushPullFIFOSmokeTest,
diff --git a/third_party/blink/renderer/platform/audio/reverb_convolver.cc b/third_party/blink/renderer/platform/audio/reverb_convolver.cc
index 80bcd9a4..da7a7ac 100644
--- a/third_party/blink/renderer/platform/audio/reverb_convolver.cc
+++ b/third_party/blink/renderer/platform/audio/reverb_convolver.cc
@@ -139,9 +139,8 @@
   // FIXME: would be better to up the thread priority here.  It doesn't need to
   // be real-time, but higher than the default...
   if (use_background_threads && background_stages_.size() > 0) {
-    background_thread_ =
-        Platform::Current()->CreateThread(WebThreadCreationParams(
-            WebThreadType::kReverbConvolutionBackgroundThread));
+    background_thread_ = Platform::Current()->CreateThread(ThreadCreationParams(
+        WebThreadType::kReverbConvolutionBackgroundThread));
   }
 }
 
diff --git a/third_party/blink/renderer/platform/audio/reverb_convolver.h b/third_party/blink/renderer/platform/audio/reverb_convolver.h
index 568c0e0..793061c 100644
--- a/third_party/blink/renderer/platform/audio/reverb_convolver.h
+++ b/third_party/blink/renderer/platform/audio/reverb_convolver.h
@@ -93,7 +93,7 @@
   size_t max_realtime_fft_size_;
 
   // Background thread and synchronization
-  std::unique_ptr<WebThread> background_thread_;
+  std::unique_ptr<Thread> background_thread_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
index b6f309a..cb13a62 100644
--- a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
+++ b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
@@ -99,7 +99,7 @@
 }
 
 void ScriptWrappableMarkingVisitor::ScheduleIdleLazyCleanup() {
-  WebThread* const thread = Platform::Current()->CurrentThread();
+  Thread* const thread = Platform::Current()->CurrentThread();
   // Thread might already be gone, or some threads (e.g. PPAPI) don't have a
   // scheduler.
   if (!thread || !thread->Scheduler())
diff --git a/third_party/blink/renderer/platform/exported/platform.cc b/third_party/blink/renderer/platform/exported/platform.cc
index e642f22..13a3cf4 100644
--- a/third_party/blink/renderer/platform/exported/platform.cc
+++ b/third_party/blink/renderer/platform/exported/platform.cc
@@ -121,7 +121,7 @@
 
 namespace {
 
-class SimpleMainThread : public WebThread {
+class SimpleMainThread : public Thread {
  public:
   // We rely on base::ThreadTaskRunnerHandle for tasks posted on the main
   // thread. The task runner handle may not be available on Blink's startup
@@ -272,12 +272,12 @@
   return g_platform;
 }
 
-WebThread* Platform::MainThread() {
+Thread* Platform::MainThread() {
   return main_thread_;
 }
 
-WebThread* Platform::CurrentThread() {
-  return static_cast<WebThread*>(current_thread_slot_.Get());
+Thread* Platform::CurrentThread() {
+  return static_cast<Thread*>(current_thread_slot_.Get());
 }
 
 service_manager::Connector* Platform::GetConnector() {
@@ -303,17 +303,17 @@
   return nullptr;
 }
 
-std::unique_ptr<WebThread> Platform::CreateThread(
-    const WebThreadCreationParams& params) {
+std::unique_ptr<Thread> Platform::CreateThread(
+    const ThreadCreationParams& params) {
   std::unique_ptr<scheduler::WebThreadBase> thread =
       scheduler::WebThreadBase::CreateWorkerThread(params);
   thread->Init();
-  WaitUntilWebThreadTLSUpdate(thread.get());
+  WaitUntilThreadTLSUpdate(thread.get());
   return std::move(thread);
 }
 
-std::unique_ptr<WebThread> Platform::CreateWebAudioThread() {
-  WebThreadCreationParams params(WebThreadType::kWebAudioThread);
+std::unique_ptr<Thread> Platform::CreateWebAudioThread() {
+  ThreadCreationParams params(WebThreadType::kWebAudioThread);
   // WebAudio uses a thread with |DISPLAY| priority to avoid glitch when the
   // system is under the high pressure. Note that the main browser thread also
   // runs with same priority. (see: crbug.com/734539)
@@ -321,20 +321,19 @@
   return CreateThread(params);
 }
 
-void Platform::WaitUntilWebThreadTLSUpdate(WebThread* thread) {
+void Platform::WaitUntilThreadTLSUpdate(Thread* thread) {
   base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                             base::WaitableEvent::InitialState::NOT_SIGNALED);
   // This cross-thread posting is guaranteed to be safe.
   PostCrossThreadTask(*thread->GetTaskRunner(), FROM_HERE,
-                      CrossThreadBind(&Platform::UpdateWebThreadTLS,
+                      CrossThreadBind(&Platform::UpdateThreadTLS,
                                       WTF::CrossThreadUnretained(this),
                                       WTF::CrossThreadUnretained(thread),
                                       WTF::CrossThreadUnretained(&event)));
   event.Wait();
 }
 
-void Platform::UpdateWebThreadTLS(WebThread* thread,
-                                  base::WaitableEvent* event) {
+void Platform::UpdateThreadTLS(Thread* thread, base::WaitableEvent* event) {
   DCHECK(!current_thread_slot_.Get());
   current_thread_slot_.Set(thread);
   event->Signal();
@@ -343,25 +342,25 @@
 void Platform::InitializeCompositorThread() {
   DCHECK(!compositor_thread_);
 
-  WebThreadCreationParams params(WebThreadType::kCompositorThread);
+  ThreadCreationParams params(WebThreadType::kCompositorThread);
 #if defined(OS_ANDROID)
   params.thread_options.priority = base::ThreadPriority::DISPLAY;
 #endif
   std::unique_ptr<scheduler::WebThreadBase> compositor_thread =
       scheduler::WebThreadBase::CreateCompositorThread(params);
   compositor_thread->Init();
-  WaitUntilWebThreadTLSUpdate(compositor_thread.get());
+  WaitUntilThreadTLSUpdate(compositor_thread.get());
   compositor_thread_ = std::move(compositor_thread);
   SetDisplayThreadPriority(compositor_thread_->ThreadId());
 }
 
-WebThread* Platform::CompositorThread() {
+Thread* Platform::CompositorThread() {
   return compositor_thread_.get();
 }
 
 scoped_refptr<base::SingleThreadTaskRunner>
 Platform::CompositorThreadTaskRunner() {
-  if (WebThread* compositor_thread = CompositorThread())
+  if (Thread* compositor_thread = CompositorThread())
     return compositor_thread->GetTaskRunner();
   return nullptr;
 }
diff --git a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
index 67e5e3f..7d748e6 100644
--- a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
+++ b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
@@ -123,7 +123,7 @@
   original_skia_image_ = texture_holder_->GetSkImage();
   original_skia_image_context_provider_wrapper_ = ContextProviderWrapper();
   DCHECK(original_skia_image_);
-  WebThread* thread = Platform::Current()->CurrentThread();
+  Thread* thread = Platform::Current()->CurrentThread();
   original_skia_image_thread_id_ = thread->ThreadId();
   original_skia_image_task_runner_ = thread->GetTaskRunner();
 }
diff --git a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc
index 0e44c04..70218ad 100644
--- a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc
+++ b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc
@@ -29,9 +29,9 @@
 namespace blink {
 namespace {
 
-std::unique_ptr<WebThread> CreateThread(const char* name) {
+std::unique_ptr<Thread> CreateThread(const char* name) {
   return Platform::Current()->CreateThread(
-      WebThreadCreationParams(WebThreadType::kTestThread)
+      ThreadCreationParams(WebThreadType::kTestThread)
           .SetThreadNameForTest(name));
 }
 
@@ -114,7 +114,7 @@
 
 TEST_F(AnimationWorkletMutatorDispatcherImplTest,
        RegisteredAnimatorShouldOnlyReceiveInputForItself) {
-  std::unique_ptr<WebThread> first_thread = CreateThread("FirstThread");
+  std::unique_ptr<Thread> first_thread = CreateThread("FirstThread");
   MockAnimationWorkletMutator* first_mutator =
       new ::testing::StrictMock<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
@@ -133,7 +133,7 @@
 
 TEST_F(AnimationWorkletMutatorDispatcherImplTest,
        RegisteredAnimatorShouldNotBeMutatedWhenNoInput) {
-  std::unique_ptr<WebThread> first_thread = CreateThread("FirstThread");
+  std::unique_ptr<Thread> first_thread = CreateThread("FirstThread");
   MockAnimationWorkletMutator* first_mutator =
       new ::testing::StrictMock<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
@@ -165,8 +165,7 @@
 TEST_F(AnimationWorkletMutatorDispatcherImplTest,
        MutationUpdateIsNotInvokedWithNullOutput) {
   // Create a thread to run mutator tasks.
-  std::unique_ptr<WebThread> first_thread =
-      CreateThread("FirstAnimationThread");
+  std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
       new ::testing::StrictMock<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
@@ -182,8 +181,7 @@
 TEST_F(AnimationWorkletMutatorDispatcherImplTest,
        MutationUpdateIsInvokedCorrectlyWithSingleRegisteredAnimator) {
   // Create a thread to run mutator tasks.
-  std::unique_ptr<WebThread> first_thread =
-      CreateThread("FirstAnimationThread");
+  std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
       new ::testing::StrictMock<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
@@ -212,8 +210,7 @@
 
 TEST_F(AnimationWorkletMutatorDispatcherImplTest,
        MutationUpdateInvokedCorrectlyWithTwoRegisteredAnimatorsOnSameThread) {
-  std::unique_ptr<WebThread> first_thread =
-      CreateThread("FirstAnimationThread");
+  std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
       new ::testing::StrictMock<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
@@ -242,14 +239,12 @@
 TEST_F(
     AnimationWorkletMutatorDispatcherImplTest,
     MutationUpdateInvokedCorrectlyWithTwoRegisteredAnimatorsOnDifferentThreads) {
-  std::unique_ptr<WebThread> first_thread =
-      CreateThread("FirstAnimationThread");
+  std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
       new ::testing::StrictMock<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
 
-  std::unique_ptr<WebThread> second_thread =
-      CreateThread("SecondAnimationThread");
+  std::unique_ptr<Thread> second_thread = CreateThread("SecondAnimationThread");
   MockAnimationWorkletMutator* second_mutator =
       new ::testing::StrictMock<MockAnimationWorkletMutator>(
           second_thread->GetTaskRunner());
diff --git a/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc b/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc
index fb5d52e..d6dd9d1c 100644
--- a/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc
+++ b/third_party/blink/renderer/platform/graphics/deferred_image_decoder_test.cc
@@ -222,8 +222,8 @@
   EXPECT_EQ(0, decode_request_count_);
 
   // Create a thread to rasterize PaintRecord.
-  std::unique_ptr<WebThread> thread = Platform::Current()->CreateThread(
-      WebThreadCreationParams(WebThreadType::kTestThread)
+  std::unique_ptr<Thread> thread = Platform::Current()->CreateThread(
+      ThreadCreationParams(WebThreadType::kTestThread)
           .SetThreadNameForTest("RasterThread"));
   PostCrossThreadTask(
       *thread->GetTaskRunner(), FROM_HERE,
diff --git a/third_party/blink/renderer/platform/graphics/image_frame_generator_test.cc b/third_party/blink/renderer/platform/graphics/image_frame_generator_test.cc
index 927278e..4c2c741 100644
--- a/third_party/blink/renderer/platform/graphics/image_frame_generator_test.cc
+++ b/third_party/blink/renderer/platform/graphics/image_frame_generator_test.cc
@@ -256,8 +256,8 @@
   // LocalFrame can now be decoded completely.
   SetFrameStatus(ImageFrame::kFrameComplete);
   AddNewData();
-  std::unique_ptr<WebThread> thread = Platform::Current()->CreateThread(
-      WebThreadCreationParams(WebThreadType::kTestThread)
+  std::unique_ptr<Thread> thread = Platform::Current()->CreateThread(
+      ThreadCreationParams(WebThreadType::kTestThread)
           .SetThreadNameForTest("DecodeThread"));
   PostCrossThreadTask(
       *thread->GetTaskRunner(), FROM_HERE,
diff --git a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc
index b2722c92..e2662653 100644
--- a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc
+++ b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc
@@ -118,7 +118,7 @@
 }
 
 void MailboxTextureHolder::InitCommon() {
-  WebThread* thread = Platform::Current()->CurrentThread();
+  Thread* thread = Platform::Current()->CurrentThread();
   thread_id_ = thread->ThreadId();
   texture_thread_task_runner_ = thread->GetTaskRunner();
 }
diff --git a/third_party/blink/renderer/platform/graphics/placeholder_image.cc b/third_party/blink/renderer/platform/graphics/placeholder_image.cc
index 56f3a93..f883e79 100644
--- a/third_party/blink/renderer/platform/graphics/placeholder_image.cc
+++ b/third_party/blink/renderer/platform/graphics/placeholder_image.cc
@@ -183,12 +183,14 @@
 
 PlaceholderImage::PlaceholderImage(ImageObserver* observer,
                                    const IntSize& size,
-                                   int64_t original_resource_size)
+                                   int64_t original_resource_size,
+                                   bool is_lazy_image)
     : Image(observer),
       size_(size),
       text_(original_resource_size <= 0
                 ? String()
                 : FormatOriginalResourceSizeBytes(original_resource_size)),
+      is_lazy_image_(is_lazy_image),
       paint_record_content_id_(-1) {}
 
 PlaceholderImage::~PlaceholderImage() = default;
@@ -247,6 +249,10 @@
                                      static_cast<float>(size_.Height())))) {
     return;
   }
+  if (is_lazy_image_) {
+    // Keep the image without any color and text decorations.
+    return;
+  }
 
   PaintFlags flags(base_flags);
   flags.setStyle(PaintFlags::kFill_Style);
diff --git a/third_party/blink/renderer/platform/graphics/placeholder_image.h b/third_party/blink/renderer/platform/graphics/placeholder_image.h
index 6bafd32..e869f99 100644
--- a/third_party/blink/renderer/platform/graphics/placeholder_image.h
+++ b/third_party/blink/renderer/platform/graphics/placeholder_image.h
@@ -24,7 +24,9 @@
 class GraphicsContext;
 class ImageObserver;
 
-// A generated placeholder image that shows a translucent gray rectangle.
+// A generated placeholder image that shows a translucent gray rectangle with
+// the full resource size (for example, 100KB) shown in the center. For
+// LazyImages the placeholder image will be a plain translucent rectangle.
 class PLATFORM_EXPORT PlaceholderImage final : public Image {
  public:
   static scoped_refptr<PlaceholderImage> Create(
@@ -32,7 +34,13 @@
       const IntSize& size,
       int64_t original_resource_size) {
     return base::AdoptRef(
-        new PlaceholderImage(observer, size, original_resource_size));
+        new PlaceholderImage(observer, size, original_resource_size, false));
+  }
+
+  static scoped_refptr<PlaceholderImage> CreateForLazyImages(
+      ImageObserver* observer,
+      const IntSize& size) {
+    return base::AdoptRef(new PlaceholderImage(observer, size, 0, true));
   }
 
   ~PlaceholderImage() override;
@@ -58,7 +66,8 @@
  private:
   PlaceholderImage(ImageObserver*,
                    const IntSize&,
-                   int64_t original_resource_size);
+                   int64_t original_resource_size,
+                   bool is_lazy_image);
 
   bool CurrentFrameHasSingleSecurityOrigin() const override;
 
@@ -78,6 +87,9 @@
   const IntSize size_;
   const String text_;
 
+  // This placeholder image is used for lazyloading of images.
+  bool is_lazy_image_;
+
   class SharedFont;
   // Lazily initialized. All instances of PlaceholderImage will share the same
   // Font object, wrapped as a SharedFont.
diff --git a/third_party/blink/renderer/platform/heap/gc_task_runner.h b/third_party/blink/renderer/platform/heap/gc_task_runner.h
index 507c4d0..5c262d85 100644
--- a/third_party/blink/renderer/platform/heap/gc_task_runner.h
+++ b/third_party/blink/renderer/platform/heap/gc_task_runner.h
@@ -39,7 +39,7 @@
 
 namespace blink {
 
-class GCTaskObserver final : public WebThread::TaskObserver {
+class GCTaskObserver final : public Thread::TaskObserver {
   USING_FAST_MALLOC(GCTaskObserver);
 
  public:
@@ -73,7 +73,7 @@
   USING_FAST_MALLOC(GCTaskRunner);
 
  public:
-  explicit GCTaskRunner(WebThread* thread)
+  explicit GCTaskRunner(Thread* thread)
       : gc_task_observer_(std::make_unique<GCTaskObserver>()), thread_(thread) {
     thread_->AddTaskObserver(gc_task_observer_.get());
   }
@@ -82,7 +82,7 @@
 
  private:
   std::unique_ptr<GCTaskObserver> gc_task_observer_;
-  WebThread* thread_;
+  Thread* thread_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/heap_test.cc b/third_party/blink/renderer/platform/heap/heap_test.cc
index 29a08ba..fa987f1 100644
--- a/third_party/blink/renderer/platform/heap/heap_test.cc
+++ b/third_party/blink/renderer/platform/heap/heap_test.cc
@@ -490,10 +490,10 @@
 class ThreadedTesterBase {
  protected:
   static void Test(ThreadedTesterBase* tester) {
-    Vector<std::unique_ptr<WebThread>, kNumberOfThreads> threads;
+    Vector<std::unique_ptr<Thread>, kNumberOfThreads> threads;
     for (int i = 0; i < kNumberOfThreads; i++) {
       threads.push_back(Platform::Current()->CreateThread(
-          WebThreadCreationParams(WebThreadType::kTestThread)
+          ThreadCreationParams(WebThreadType::kTestThread)
               .SetThreadNameForTest("blink gc testing thread")));
       PostCrossThreadTask(
           *threads.back()->GetTaskRunner(), FROM_HERE,
@@ -5447,10 +5447,9 @@
     IntWrapper::destructor_calls_ = 0;
 
     MutexLocker locker(MainThreadMutex());
-    std::unique_ptr<WebThread> worker_thread =
-        Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
-                .SetThreadNameForTest("Test Worker Thread"));
+    std::unique_ptr<Thread> worker_thread = Platform::Current()->CreateThread(
+        ThreadCreationParams(WebThreadType::kTestThread)
+            .SetThreadNameForTest("Test Worker Thread"));
     PostCrossThreadTask(*worker_thread->GetTaskRunner(), FROM_HERE,
                         CrossThreadBind(WorkerThreadMain));
 
@@ -5548,10 +5547,9 @@
     IntWrapper::destructor_calls_ = 0;
 
     MutexLocker locker(MainThreadMutex());
-    std::unique_ptr<WebThread> worker_thread =
-        Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
-                .SetThreadNameForTest("Test Worker Thread"));
+    std::unique_ptr<Thread> worker_thread = Platform::Current()->CreateThread(
+        ThreadCreationParams(WebThreadType::kTestThread)
+            .SetThreadNameForTest("Test Worker Thread"));
     PostCrossThreadTask(
         *worker_thread->GetTaskRunner(), FROM_HERE,
         CrossThreadBind(&MemberSameThreadCheckTester::WorkerThreadMain,
@@ -5593,10 +5591,9 @@
     IntWrapper::destructor_calls_ = 0;
 
     MutexLocker locker(MainThreadMutex());
-    std::unique_ptr<WebThread> worker_thread =
-        Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
-                .SetThreadNameForTest("Test Worker Thread"));
+    std::unique_ptr<Thread> worker_thread = Platform::Current()->CreateThread(
+        ThreadCreationParams(WebThreadType::kTestThread)
+            .SetThreadNameForTest("Test Worker Thread"));
     PostCrossThreadTask(
         *worker_thread->GetTaskRunner(), FROM_HERE,
         CrossThreadBind(&PersistentSameThreadCheckTester::WorkerThreadMain,
@@ -5638,10 +5635,9 @@
     IntWrapper::destructor_calls_ = 0;
 
     MutexLocker locker(MainThreadMutex());
-    std::unique_ptr<WebThread> worker_thread =
-        Platform::Current()->CreateThread(
-            WebThreadCreationParams(WebThreadType::kTestThread)
-                .SetThreadNameForTest("Test Worker Thread"));
+    std::unique_ptr<Thread> worker_thread = Platform::Current()->CreateThread(
+        ThreadCreationParams(WebThreadType::kTestThread)
+            .SetThreadNameForTest("Test Worker Thread"));
     Persistent<MainThreadObject> main_thread_object = new MainThreadObject();
     PostCrossThreadTask(
         *worker_thread->GetTaskRunner(), FROM_HERE,
@@ -6435,8 +6431,8 @@
   // Step 1: Initiate a worker thread, and wait for |object| to get allocated on
   // the worker thread.
   MutexLocker main_thread_mutex_locker(MainThreadMutex());
-  std::unique_ptr<WebThread> worker_thread = Platform::Current()->CreateThread(
-      WebThreadCreationParams(WebThreadType::kTestThread)
+  std::unique_ptr<Thread> worker_thread = Platform::Current()->CreateThread(
+      ThreadCreationParams(WebThreadType::kTestThread)
           .SetThreadNameForTest("Test Worker Thread"));
   DestructorLockingObject* object = nullptr;
   PostCrossThreadTask(
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index 875b5d6f..6d88de3 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -222,7 +222,7 @@
   new (main_thread_state_storage_) ThreadState();
 
   // PpapiThread doesn't set the current thread.
-  WebThread* current_thread = Platform::Current()->CurrentThread();
+  Thread* current_thread = Platform::Current()->CurrentThread();
   if (current_thread) {
     ThreadScheduler* scheduler = current_thread->Scheduler();
     // Some binaries do not have a scheduler (e.g.
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc
index f55522b5..d704559 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.cc
@@ -117,6 +117,12 @@
   SetAllowImagePlaceholder();
 }
 
+void FetchParameters::SetLazyImagePlaceholder() {
+  resource_request_.SetPreviewsState(resource_request_.GetPreviewsState() |
+                                     WebURLRequest::kLazyImageLoadDeferred);
+  SetAllowImagePlaceholder();
+}
+
 void FetchParameters::SetAllowImagePlaceholder() {
   DCHECK_EQ(kNone, image_request_optimization_);
   if (!resource_request_.Url().ProtocolIsInHTTPFamily() ||
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
index 41f5632..229410e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
@@ -178,16 +178,20 @@
     return image_request_optimization_;
   }
 
+  // Configures the request to load an image as a placeholder and sets the
+  // Client LoFi preview bit.
+  void SetClientLoFiPlaceholder();
+
+  // Configures the request to load an image as a placeholder and sets the
+  // lazy image load bit.
+  void SetLazyImagePlaceholder();
+
   // Configures the request to load an image placeholder if the request is
   // eligible (e.g. the url's protocol is HTTP, etc.). If this request is
   // non-eligible, this method doesn't modify the ResourceRequest. Calling this
   // method sets image_request_optimization_ to the appropriate value.
   void SetAllowImagePlaceholder();
 
-  // Configures the request to load an image as a placeholder and sets the
-  // Client LoFi preview bit.
-  void SetClientLoFiPlaceholder();
-
  private:
   ResourceRequest resource_request_;
   // |decoder_options_|'s ContentType is set to |kPlainTextContent| in
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_response_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_response_test.cc
index 6fff11d..9d5f60e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_response_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_response_test.cc
@@ -76,8 +76,8 @@
 
   ResourceResponse response(CreateTestResponse());
   RunHeaderRelatedTest(response);
-  std::unique_ptr<WebThread> thread = Platform::Current()->CreateThread(
-      WebThreadCreationParams(WebThreadType::kTestThread)
+  std::unique_ptr<Thread> thread = Platform::Current()->CreateThread(
+      ThreadCreationParams(WebThreadType::kTestThread)
           .SetThreadNameForTest("WorkerThread"));
   PostCrossThreadTask(*thread->GetTaskRunner(), FROM_HERE,
                       CrossThreadBind(&RunInThread));
diff --git a/third_party/blink/renderer/platform/memory_coordinator.cc b/third_party/blink/renderer/platform/memory_coordinator.cc
index 8775dbf..cd58de7 100644
--- a/third_party/blink/renderer/platform/memory_coordinator.cc
+++ b/third_party/blink/renderer/platform/memory_coordinator.cc
@@ -62,14 +62,14 @@
   return *external.Get();
 }
 
-void MemoryCoordinator::RegisterThread(WebThread* thread) {
-  MutexLocker lock(web_threads_mutex_);
-  web_threads_.insert(thread);
+void MemoryCoordinator::RegisterThread(Thread* thread) {
+  MutexLocker lock(threads_mutex_);
+  threads_.insert(thread);
 }
 
-void MemoryCoordinator::UnregisterThread(WebThread* thread) {
-  MutexLocker lock(web_threads_mutex_);
-  web_threads_.erase(thread);
+void MemoryCoordinator::UnregisterThread(Thread* thread) {
+  MutexLocker lock(threads_mutex_);
+  threads_.erase(thread);
 }
 
 MemoryCoordinator::MemoryCoordinator() = default;
@@ -111,8 +111,8 @@
   WTF::Partitions::DecommitFreeableMemory();
 
   // Thread-specific data never issues a layout, so we are safe here.
-  MutexLocker lock(web_threads_mutex_);
-  for (auto* thread : web_threads_) {
+  MutexLocker lock(threads_mutex_);
+  for (auto* thread : threads_) {
     if (!thread->GetTaskRunner())
       continue;
 
diff --git a/third_party/blink/renderer/platform/memory_coordinator.h b/third_party/blink/renderer/platform/memory_coordinator.h
index 4473643..b652a68 100644
--- a/third_party/blink/renderer/platform/memory_coordinator.h
+++ b/third_party/blink/renderer/platform/memory_coordinator.h
@@ -52,8 +52,8 @@
   // the heap size.
   static void Initialize();
 
-  void RegisterThread(WebThread*) LOCKS_EXCLUDED(web_threads_mutex_);
-  void UnregisterThread(WebThread*) LOCKS_EXCLUDED(web_threads_mutex_);
+  void RegisterThread(Thread*) LOCKS_EXCLUDED(threads_mutex_);
+  void UnregisterThread(Thread*) LOCKS_EXCLUDED(threads_mutex_);
 
   void RegisterClient(MemoryCoordinatorClient*);
   void UnregisterClient(MemoryCoordinatorClient*);
@@ -81,8 +81,8 @@
   static bool is_low_end_device_;
 
   HeapHashSet<WeakMember<MemoryCoordinatorClient>> clients_;
-  HashSet<WebThread*> web_threads_;
-  Mutex web_threads_mutex_;
+  HashSet<Thread*> threads_;
+  Mutex threads_mutex_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/child/webthread_base.cc b/third_party/blink/renderer/platform/scheduler/child/webthread_base.cc
index da5796c..f83120a 100644
--- a/third_party/blink/renderer/platform/scheduler/child/webthread_base.cc
+++ b/third_party/blink/renderer/platform/scheduler/child/webthread_base.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.
 
-// An implementation of WebThread in terms of base::MessageLoop and
+// An implementation of blink::Thread in terms of base::MessageLoop and
 // base::Thread
 
 #include "third_party/blink/public/platform/scheduler/child/webthread_base.h"
@@ -24,7 +24,7 @@
 class WebThreadBase::TaskObserverAdapter
     : public base::MessageLoop::TaskObserver {
  public:
-  explicit TaskObserverAdapter(WebThread::TaskObserver* observer)
+  explicit TaskObserverAdapter(Thread::TaskObserver* observer)
       : observer_(observer) {}
 
   void WillProcessTask(const base::PendingTask& pending_task) override {
@@ -36,7 +36,7 @@
   }
 
  private:
-  WebThread::TaskObserver* observer_;
+  Thread::TaskObserver* observer_;
 };
 
 WebThreadBase::WebThreadBase() = default;
@@ -94,9 +94,8 @@
 
 class WebThreadForCompositor : public WebThreadImplForWorkerScheduler {
  public:
-  explicit WebThreadForCompositor(const WebThreadCreationParams& params)
-      : WebThreadImplForWorkerScheduler(params) {
-  }
+  explicit WebThreadForCompositor(const ThreadCreationParams& params)
+      : WebThreadImplForWorkerScheduler(params) {}
   ~WebThreadForCompositor() override = default;
 
  private:
@@ -113,12 +112,12 @@
 }  // namespace
 
 std::unique_ptr<WebThreadBase> WebThreadBase::CreateWorkerThread(
-    const WebThreadCreationParams& params) {
+    const ThreadCreationParams& params) {
   return std::make_unique<WebThreadImplForWorkerScheduler>(params);
 }
 
 std::unique_ptr<WebThreadBase> WebThreadBase::CreateCompositorThread(
-    const WebThreadCreationParams& params) {
+    const ThreadCreationParams& params) {
   return std::make_unique<WebThreadForCompositor>(params);
 }
 
diff --git a/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc b/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
index 0c6d9d0..040992c2 100644
--- a/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
@@ -19,7 +19,7 @@
 namespace scheduler {
 
 WebThreadImplForWorkerScheduler::WebThreadImplForWorkerScheduler(
-    const WebThreadCreationParams& params)
+    const ThreadCreationParams& params)
     : thread_(new base::Thread(params.name ? params.name : std::string())),
       thread_type_(params.thread_type),
       worker_scheduler_proxy_(params.frame_or_worker_scheduler
diff --git a/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.h b/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.h
index 53ebf8b6..893889b 100644
--- a/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler.h
@@ -32,11 +32,10 @@
     : public WebThreadBase,
       public base::MessageLoopCurrent::DestructionObserver {
  public:
-  explicit WebThreadImplForWorkerScheduler(
-      const WebThreadCreationParams& params);
+  explicit WebThreadImplForWorkerScheduler(const ThreadCreationParams& params);
   ~WebThreadImplForWorkerScheduler() override;
 
-  // WebThread implementation.
+  // Thread implementation.
   ThreadScheduler* Scheduler() override;
   PlatformThreadId ThreadId() const override;
   scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() const override;
diff --git a/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler_unittest.cc b/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler_unittest.cc
index 17fb0e1..95c2a1bc 100644
--- a/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/child/webthread_impl_for_worker_scheduler_unittest.cc
@@ -32,7 +32,7 @@
   MOCK_METHOD1(Run, void(double deadline));
 };
 
-class TestObserver : public blink::WebThread::TaskObserver {
+class TestObserver : public Thread::TaskObserver {
  public:
   explicit TestObserver(std::string* calls) : calls_(calls) {}
 
@@ -72,7 +72,7 @@
 
   void SetUp() override {
     thread_.reset(new WebThreadImplForWorkerScheduler(
-        WebThreadCreationParams(WebThreadType::kTestThread)));
+        ThreadCreationParams(WebThreadType::kTestThread)));
     thread_->Init();
   }
 
diff --git a/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.cc
index eca2e1ec..00a81c1 100644
--- a/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.cc
@@ -26,13 +26,11 @@
 }
 
 void SimpleThreadScheduler::PostIdleTask(const base::Location& location,
-                                         WebThread::IdleTask task) {
-}
+                                         Thread::IdleTask task) {}
 
 void SimpleThreadScheduler::PostNonNestableIdleTask(
     const base::Location& location,
-    WebThread::IdleTask task) {
-}
+    Thread::IdleTask task) {}
 
 void SimpleThreadScheduler::AddRAILModeObserver(WebRAILModeObserver* observer) {
 }
diff --git a/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.h b/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.h
index fe9337c..ad97b8b 100644
--- a/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/common/simple_thread_scheduler.h
@@ -36,9 +36,9 @@
   bool CanExceedIdleDeadlineIfRequired() const override;
 
   // Those tasks are simply ignored (we assume there's no idle period).
-  void PostIdleTask(const base::Location&, WebThread::IdleTask) override;
+  void PostIdleTask(const base::Location&, Thread::IdleTask) override;
   void PostNonNestableIdleTask(const base::Location&,
-                               WebThread::IdleTask) override;
+                               Thread::IdleTask) override;
 
   // Do nothing (the observer won't get notified).
   void AddRAILModeObserver(WebRAILModeObserver*) override;
diff --git a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
index 09fe080..e81a397 100644
--- a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
@@ -76,7 +76,7 @@
   return nullptr;
 }
 
-std::unique_ptr<WebThread> WebThreadScheduler::CreateMainThread() {
+std::unique_ptr<Thread> WebThreadScheduler::CreateMainThread() {
   NOTREACHED();
   return nullptr;
 }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index c87c410..9f6f633 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -656,7 +656,7 @@
   was_shutdown_ = true;
 }
 
-std::unique_ptr<blink::WebThread> MainThreadSchedulerImpl::CreateMainThread() {
+std::unique_ptr<Thread> MainThreadSchedulerImpl::CreateMainThread() {
   return std::make_unique<WebThreadImplForRendererScheduler>(this);
 }
 
@@ -2396,13 +2396,13 @@
                                     WebString(WTF::String(name)));
 }
 
-void MainThreadSchedulerImpl::RunIdleTask(WebThread::IdleTask task,
+void MainThreadSchedulerImpl::RunIdleTask(Thread::IdleTask task,
                                           base::TimeTicks deadline) {
   std::move(task).Run(deadline);
 }
 
 void MainThreadSchedulerImpl::PostIdleTask(const base::Location& location,
-                                           WebThread::IdleTask task) {
+                                           Thread::IdleTask task) {
   IdleTaskRunner()->PostIdleTask(
       location,
       base::BindOnce(&MainThreadSchedulerImpl::RunIdleTask, std::move(task)));
@@ -2410,7 +2410,7 @@
 
 void MainThreadSchedulerImpl::PostNonNestableIdleTask(
     const base::Location& location,
-    WebThread::IdleTask task) {
+    Thread::IdleTask task) {
   IdleTaskRunner()->PostNonNestableIdleTask(
       location,
       base::BindOnce(&MainThreadSchedulerImpl::RunIdleTask, std::move(task)));
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
index f275c5ff..97d61fb 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -160,7 +160,7 @@
   ~MainThreadSchedulerImpl() override;
 
   // WebThreadScheduler implementation:
-  std::unique_ptr<WebThread> CreateMainThread() override;
+  std::unique_ptr<Thread> CreateMainThread() override;
   scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override;
   // Note: this is also shared by the ThreadScheduler interface.
   scoped_refptr<base::SingleThreadTaskRunner> IPCTaskRunner() override;
@@ -204,9 +204,9 @@
       WebScopedVirtualTimePauser::VirtualTaskDuration duration) override;
 
   // ThreadScheduler implementation:
-  void PostIdleTask(const base::Location&, WebThread::IdleTask) override;
+  void PostIdleTask(const base::Location&, Thread::IdleTask) override;
   void PostNonNestableIdleTask(const base::Location&,
-                               WebThread::IdleTask) override;
+                               Thread::IdleTask) override;
   scoped_refptr<base::SingleThreadTaskRunner> V8TaskRunner() override;
   scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner() override;
   // IPCTaskRunner() is implemented above in the WebThreadScheduler section.
@@ -721,7 +721,7 @@
   // trigger a priority update.
   bool ShouldUpdateTaskQueuePriorities(Policy new_policy) const;
 
-  static void RunIdleTask(WebThread::IdleTask, base::TimeTicks deadline);
+  static void RunIdleTask(Thread::IdleTask, base::TimeTicks deadline);
 
   // Probabilistically record all task metadata for the current task.
   // If task belongs to a per-frame queue, this task is attributed to
diff --git a/third_party/blink/renderer/platform/scheduler/public/thread.h b/third_party/blink/renderer/platform/scheduler/public/thread.h
index f704c69..61f99d1 100644
--- a/third_party/blink/renderer/platform/scheduler/public/thread.h
+++ b/third_party/blink/renderer/platform/scheduler/public/thread.h
@@ -123,12 +123,6 @@
   virtual bool IsSimpleMainThread() const { return false; }
 };
 
-// Temporary aliases while we rename those classes in Blink.
-//
-// TODO(yutak): Rename all the occurrences and remove the aliases.
-using WebThreadCreationParams = ThreadCreationParams;
-using WebThread = Thread;
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_PUBLIC_THREAD_H_
diff --git a/third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h
index 1fc3fe7..8cdc688e 100644
--- a/third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h
@@ -58,7 +58,7 @@
   // tasks which may be reordered relative to other task types and may be
   // starved for an arbitrarily long time if no idle time is available.
   // Takes ownership of |IdleTask|. Can be called from any thread.
-  virtual void PostIdleTask(const base::Location&, WebThread::IdleTask) = 0;
+  virtual void PostIdleTask(const base::Location&, Thread::IdleTask) = 0;
 
   // Like postIdleTask but guarantees that the posted task will not run
   // nested within an already-running task. Posting an idle task as
@@ -66,7 +66,7 @@
   // make it run later than it normally would, but it won't make it
   // run earlier than it normally would.
   virtual void PostNonNestableIdleTask(const base::Location&,
-                                       WebThread::IdleTask) = 0;
+                                       Thread::IdleTask) = 0;
 
   virtual void AddRAILModeObserver(
       scheduler::WebRAILModeObserver* observer) = 0;
diff --git a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc
index a0a944e..c9fc347 100644
--- a/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler_unittest.cc
@@ -30,7 +30,7 @@
   MOCK_METHOD0(Run, void());
 };
 
-class MockTaskObserver : public blink::WebThread::TaskObserver {
+class MockTaskObserver : public Thread::TaskObserver {
  public:
   MOCK_METHOD0(WillProcessTask, void());
   MOCK_METHOD0(DidProcessTask, void());
@@ -62,7 +62,7 @@
   base::MessageLoop message_loop_;
   base::SimpleTestTickClock clock_;
   std::unique_ptr<MainThreadSchedulerImpl> scheduler_;
-  std::unique_ptr<blink::WebThread> thread_;
+  std::unique_ptr<Thread> thread_;
 
   DISALLOW_COPY_AND_ASSIGN(WebThreadImplForRendererSchedulerTest);
 };
@@ -79,7 +79,7 @@
     EXPECT_CALL(observer, DidProcessTask());
   }
 
-  thread_->GetTaskRunner()->PostTask(
+  message_loop_.task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&MockTask::Run, WTF::Unretained(&task)));
   base::RunLoop().RunUntilIdle();
   thread_->RemoveTaskObserver(&observer);
@@ -98,7 +98,7 @@
     EXPECT_CALL(observer, DidProcessTask());
   }
 
-  thread_->GetTaskRunner()->PostTask(
+  message_loop_.task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&MockTask::Run, WTF::Unretained(&task)));
   base::RunLoop().RunUntilIdle();
   thread_->RemoveTaskObserver(&observer);
@@ -122,9 +122,9 @@
     EXPECT_CALL(observer, DidProcessTask());
   }
 
-  thread_->GetTaskRunner()->PostTask(
+  message_loop_.task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&MockTask::Run, WTF::Unretained(&task1)));
-  thread_->GetTaskRunner()->PostTask(
+  message_loop_.task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&MockTask::Run, WTF::Unretained(&task2)));
   base::RunLoop().RunUntilIdle();
   thread_->RemoveTaskObserver(&observer);
@@ -153,21 +153,21 @@
     EXPECT_CALL(observer, DidProcessTask());
   }
 
-  thread_->GetTaskRunner()->PostTask(
+  message_loop_.task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&MockTask::Run, WTF::Unretained(&task1)));
-  thread_->GetTaskRunner()->PostTask(
+  message_loop_.task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&MockTask::Run, WTF::Unretained(&task2)));
-  thread_->GetTaskRunner()->PostTask(
+  message_loop_.task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&MockTask::Run, WTF::Unretained(&task3)));
   base::RunLoop().RunUntilIdle();
   thread_->RemoveTaskObserver(&observer);
 }
 
-void EnterRunLoop(base::MessageLoop* message_loop, blink::WebThread* thread) {
-  // Note: WebThreads do not support nested run loops, which is why we use a
+void EnterRunLoop(base::MessageLoop* message_loop, Thread* thread) {
+  // Note: blink::Threads do not support nested run loops, which is why we use a
   // run loop directly.
   base::RunLoop run_loop;
-  thread->GetTaskRunner()->PostTask(
+  message_loop->task_runner()->PostTask(
       FROM_HERE, WTF::Bind(&base::RunLoop::Quit, WTF::Unretained(&run_loop)));
   message_loop->SetNestableTasksAllowed(true);
   run_loop.Run();
diff --git a/third_party/blink/renderer/platform/scheduler/test/fake_renderer_scheduler.cc b/third_party/blink/renderer/platform/scheduler/test/fake_renderer_scheduler.cc
index a5d5688..565bfa6 100644
--- a/third_party/blink/renderer/platform/scheduler/test/fake_renderer_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/test/fake_renderer_scheduler.cc
@@ -17,7 +17,7 @@
 
 FakeRendererScheduler::~FakeRendererScheduler() = default;
 
-std::unique_ptr<blink::WebThread> FakeRendererScheduler::CreateMainThread() {
+std::unique_ptr<Thread> FakeRendererScheduler::CreateMainThread() {
   return nullptr;
 }
 
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc
index 4c0fa097..f8d43f2c 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc
@@ -40,13 +40,13 @@
                                   .SetTimeDomain(nullptr));
 }
 
-void NonMainThreadSchedulerImpl::RunIdleTask(blink::WebThread::IdleTask task,
+void NonMainThreadSchedulerImpl::RunIdleTask(Thread::IdleTask task,
                                              base::TimeTicks deadline) {
   std::move(task).Run(deadline);
 }
 
 void NonMainThreadSchedulerImpl::PostIdleTask(const base::Location& location,
-                                              blink::WebThread::IdleTask task) {
+                                              Thread::IdleTask task) {
   IdleTaskRunner()->PostIdleTask(
       location, base::BindOnce(&NonMainThreadSchedulerImpl::RunIdleTask,
                                std::move(task)));
@@ -54,7 +54,7 @@
 
 void NonMainThreadSchedulerImpl::PostNonNestableIdleTask(
     const base::Location& location,
-    blink::WebThread::IdleTask task) {
+    Thread::IdleTask task) {
   IdleTaskRunner()->PostNonNestableIdleTask(
       location, base::BindOnce(&NonMainThreadSchedulerImpl::RunIdleTask,
                                std::move(task)));
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
index d16e6d69..a06d242c 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
@@ -58,9 +58,9 @@
   // TODO(yutak): Some functions are only meaningful in main thread. Move them
   // to MainThreadScheduler.
   void PostIdleTask(const base::Location& location,
-                    WebThread::IdleTask task) override;
+                    Thread::IdleTask task) override;
   void PostNonNestableIdleTask(const base::Location& location,
-                               WebThread::IdleTask task) override;
+                               Thread::IdleTask task) override;
   std::unique_ptr<PageScheduler> CreatePageScheduler(
       PageScheduler::Delegate*) override;
   std::unique_ptr<RendererPauseHandle> PauseScheduler() override
@@ -86,7 +86,7 @@
   scoped_refptr<NonMainThreadTaskQueue> CreateTaskQueue(const char* name);
 
  protected:
-  static void RunIdleTask(WebThread::IdleTask task, base::TimeTicks deadline);
+  static void RunIdleTask(Thread::IdleTask task, base::TimeTicks deadline);
 
   explicit NonMainThreadSchedulerImpl(
       std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager,
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy_unittest.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy_unittest.cc
index bbb555d9..036af44 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy_unittest.cc
@@ -51,7 +51,7 @@
   WebThreadImplForWorkerSchedulerForTest(FrameScheduler* frame_scheduler,
                                          WaitableEvent* throtting_state_changed)
       : WebThreadImplForWorkerScheduler(
-            WebThreadCreationParams(WebThreadType::kTestThread)
+            ThreadCreationParams(WebThreadType::kTestThread)
                 .SetFrameOrWorkerScheduler(frame_scheduler)),
         throtting_state_changed_(throtting_state_changed) {}
 
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.cc b/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.cc
index f7aed1b..1a32b34 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.cc
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.cc
@@ -11,7 +11,7 @@
 
 namespace {
 
-class ThreadWithCustomScheduler : public WebThread {
+class ThreadWithCustomScheduler : public Thread {
  public:
   explicit ThreadWithCustomScheduler(ThreadScheduler* scheduler)
       : scheduler_(scheduler) {}
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.h b/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.h
index d800c76..604b8a3 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.h
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support_with_custom_scheduler.h
@@ -27,7 +27,7 @@
   ~TestingPlatformSupportWithCustomScheduler() override;
 
  private:
-  std::unique_ptr<WebThread> thread_;
+  std::unique_ptr<Thread> thread_;
 
   DISALLOW_COPY_AND_ASSIGN(TestingPlatformSupportWithCustomScheduler);
 };
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h b/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h
index 12e06e72..46027c9 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h
@@ -77,7 +77,7 @@
   std::unique_ptr<scheduler::MainThreadSchedulerImpl> scheduler_;
   base::sequence_manager::SequenceManager*
       sequence_manager_;  // Owned by scheduler_.
-  std::unique_ptr<WebThread> thread_;
+  std::unique_ptr<Thread> thread_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/web_thread_supporting_gc.cc b/third_party/blink/renderer/platform/web_thread_supporting_gc.cc
index 74c9740d..a5f0a3b 100644
--- a/third_party/blink/renderer/platform/web_thread_supporting_gc.cc
+++ b/third_party/blink/renderer/platform/web_thread_supporting_gc.cc
@@ -14,18 +14,17 @@
 namespace blink {
 
 std::unique_ptr<WebThreadSupportingGC> WebThreadSupportingGC::Create(
-    const WebThreadCreationParams& params) {
+    const ThreadCreationParams& params) {
   return base::WrapUnique(new WebThreadSupportingGC(&params, nullptr));
 }
 
 std::unique_ptr<WebThreadSupportingGC> WebThreadSupportingGC::CreateForThread(
-    WebThread* thread) {
+    Thread* thread) {
   return base::WrapUnique(new WebThreadSupportingGC(nullptr, thread));
 }
 
-WebThreadSupportingGC::WebThreadSupportingGC(
-    const WebThreadCreationParams* params,
-    WebThread* thread)
+WebThreadSupportingGC::WebThreadSupportingGC(const ThreadCreationParams* params,
+                                             Thread* thread)
     : thread_(thread) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(!params || !thread);
@@ -35,16 +34,14 @@
   WTF::WillCreateThread();
 #endif
   if (!thread_) {
-    // TODO(scheduler-dev): AnimationWorklet can pass nullptr as WebThread*
+    // TODO(scheduler-dev): AnimationWorklet can pass nullptr as Thread*
     // reference when a test doesn't have a compositor thread.
     if (params->thread_type == WebThreadType::kAudioWorkletThread) {
       owning_thread_ = Platform::Current()->CreateWebAudioThread();
     } else {
       // If |thread| is not given, create a new one and own it.
-      owning_thread_ =
-          Platform::Current()->CreateThread(params
-              ? *params
-              : WebThreadCreationParams(WebThreadType::kTestThread));
+      owning_thread_ = Platform::Current()->CreateThread(
+          params ? *params : ThreadCreationParams(WebThreadType::kTestThread));
     }
     thread_ = owning_thread_.get();
   }
@@ -53,7 +50,7 @@
 
 WebThreadSupportingGC::~WebThreadSupportingGC() {
   DETACH_FROM_THREAD(thread_checker_);
-  // WebThread's destructor blocks until all the tasks are processed.
+  // blink::Thread's destructor blocks until all the tasks are processed.
   owning_thread_.reset();
   MemoryCoordinator::Instance().UnregisterThread(thread_);
 }
diff --git a/third_party/blink/renderer/platform/web_thread_supporting_gc.h b/third_party/blink/renderer/platform/web_thread_supporting_gc.h
index cdb78ee..03731ef 100644
--- a/third_party/blink/renderer/platform/web_thread_supporting_gc.h
+++ b/third_party/blink/renderer/platform/web_thread_supporting_gc.h
@@ -33,8 +33,8 @@
 
  public:
   static std::unique_ptr<WebThreadSupportingGC> Create(
-      const WebThreadCreationParams&);
-  static std::unique_ptr<WebThreadSupportingGC> CreateForThread(WebThread*);
+      const ThreadCreationParams&);
+  static std::unique_ptr<WebThreadSupportingGC> CreateForThread(Thread*);
   ~WebThreadSupportingGC();
 
   void PostTask(const base::Location& location, base::OnceClosure task) {
@@ -60,33 +60,33 @@
 
   bool IsCurrentThread() const { return thread_->IsCurrentThread(); }
 
-  void AddTaskObserver(WebThread::TaskObserver* observer) {
+  void AddTaskObserver(Thread::TaskObserver* observer) {
     thread_->AddTaskObserver(observer);
   }
 
-  void RemoveTaskObserver(WebThread::TaskObserver* observer) {
+  void RemoveTaskObserver(Thread::TaskObserver* observer) {
     thread_->RemoveTaskObserver(observer);
   }
 
-  // Must be called on the WebThread.
+  // Must be called on the matching blink::Thread.
   void InitializeOnThread();
   void ShutdownOnThread();
 
-  WebThread& PlatformThread() const {
+  Thread& PlatformThread() const {
     DCHECK(thread_);
     return *thread_;
   }
 
  private:
-  WebThreadSupportingGC(const WebThreadCreationParams*, WebThread*);
+  WebThreadSupportingGC(const ThreadCreationParams*, Thread*);
 
   std::unique_ptr<GCTaskRunner> gc_task_runner_;
 
   // m_thread is guaranteed to be non-null after this instance is constructed.
   // m_owningThread is non-null unless this instance is constructed for an
   // existing thread via createForThread().
-  WebThread* thread_ = nullptr;
-  std::unique_ptr<WebThread> owning_thread_;
+  Thread* thread_ = nullptr;
+  std::unique_ptr<Thread> owning_thread_;
 
   THREAD_CHECKER(thread_checker_);
 };
diff --git a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py
index 0fad61c..bd97ff32 100644
--- a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py
+++ b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py
@@ -32,6 +32,7 @@
 from blinkpy.common.host_mock import MockHost
 from blinkpy.common.system.filesystem_mock import MockFileSystem
 from blinkpy.common.path_finder import PathFinder
+from blinkpy.common.path_finder import RELATIVE_WEB_TESTS
 from blinkpy.web_tests.builder_list import BuilderList
 
 ALL_PASS_TESTHARNESS_RESULT = """This is a testharness.js-based test.
@@ -45,6 +46,8 @@
 Harness: the test ran to completion.
 """
 
+MOCK_WEB_TESTS = '/mock-checkout/' + RELATIVE_WEB_TESTS
+
 
 class BaselineOptimizerTest(unittest.TestCase):
 
@@ -379,52 +382,52 @@
     # Tests for protected methods - pylint: disable=protected-access
 
     def test_move_baselines(self):
-        self.fs.write_text_file('/mock-checkout/third_party/WebKit/LayoutTests/VirtualTestSuites', '[]')
+        self.fs.write_text_file(MOCK_WEB_TESTS + 'VirtualTestSuites', '[]')
         self.fs.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/test-expected.txt', 'result A')
+            MOCK_WEB_TESTS + 'platform/win/another/test-expected.txt', 'result A')
         self.fs.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/test-expected.txt', 'result A')
-        self.fs.write_binary_file('/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt', 'result B')
+            MOCK_WEB_TESTS + 'platform/mac/another/test-expected.txt', 'result A')
+        self.fs.write_binary_file(MOCK_WEB_TESTS + 'another/test-expected.txt', 'result B')
         baseline_optimizer = BaselineOptimizer(
             self.host, self.host.port_factory.get(), self.host.port_factory.all_port_names())
         baseline_optimizer._move_baselines(
             'another/test-expected.txt',
             {
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb',
+                MOCK_WEB_TESTS + 'platform/win': 'aaa',
+                MOCK_WEB_TESTS + 'platform/mac': 'aaa',
+                MOCK_WEB_TESTS[:-1]: 'bbb',
             },
             {
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa',
+                MOCK_WEB_TESTS[:-1]: 'aaa',
             })
         self.assertEqual(
             self.fs.read_binary_file(
-                '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt'),
+                MOCK_WEB_TESTS + 'another/test-expected.txt'),
             'result A')
 
     def test_move_baselines_skip_git_commands(self):
-        self.fs.write_text_file('/mock-checkout/third_party/WebKit/LayoutTests/VirtualTestSuites', '[]')
+        self.fs.write_text_file(MOCK_WEB_TESTS + 'VirtualTestSuites', '[]')
         self.fs.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/test-expected.txt', 'result A')
+            MOCK_WEB_TESTS + 'platform/win/another/test-expected.txt', 'result A')
         self.fs.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/test-expected.txt', 'result A')
-        self.fs.write_binary_file('/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt', 'result B')
+            MOCK_WEB_TESTS + 'platform/mac/another/test-expected.txt', 'result A')
+        self.fs.write_binary_file(MOCK_WEB_TESTS + 'another/test-expected.txt', 'result B')
         baseline_optimizer = BaselineOptimizer(
             self.host, self.host.port_factory.get(), self.host.port_factory.all_port_names())
         baseline_optimizer._move_baselines(
             'another/test-expected.txt',
             {
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb',
+                MOCK_WEB_TESTS + 'platform/win': 'aaa',
+                MOCK_WEB_TESTS + 'platform/mac': 'aaa',
+                MOCK_WEB_TESTS[:-1]: 'bbb',
             },
             {
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/linux': 'bbb',
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa',
+                MOCK_WEB_TESTS + 'platform/linux': 'bbb',
+                MOCK_WEB_TESTS[:-1]: 'aaa',
             })
         self.assertEqual(
             self.fs.read_binary_file(
-                '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt'),
+                MOCK_WEB_TESTS + 'another/test-expected.txt'),
             'result A')
 
 
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py
index 64e1a031..8328b853 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py
@@ -66,16 +66,16 @@
     def test_baseline_directory(self):
         self.assertMultiLineEqual(
             self.command.baseline_directory('MOCK Mac10.11'),
-            '/test.checkout/LayoutTests/platform/test-mac-mac10.11')
+            '/test.checkout/wtests/platform/test-mac-mac10.11')
         self.assertMultiLineEqual(
             self.command.baseline_directory('MOCK Mac10.10'),
-            '/test.checkout/LayoutTests/platform/test-mac-mac10.10')
+            '/test.checkout/wtests/platform/test-mac-mac10.10')
         self.assertMultiLineEqual(
             self.command.baseline_directory('MOCK Trusty'),
-            '/test.checkout/LayoutTests/platform/test-linux-trusty')
+            '/test.checkout/wtests/platform/test-linux-trusty')
         self.assertMultiLineEqual(
             self.command.baseline_directory('MOCK Precise'),
-            '/test.checkout/LayoutTests/platform/test-linux-precise')
+            '/test.checkout/wtests/platform/test-linux-precise')
 
     def test_rebaseline_updates_expectations_file_noop(self):
         # pylint: disable=protected-access
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py
index a7c61a3..91e779b 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py
@@ -131,9 +131,9 @@
         # pylint: disable=protected-access
         baseline_paths = self.command._generic_baseline_paths(test_baseline_set)
         self.assertEqual(baseline_paths, [
-            '/test.checkout/LayoutTests/passes/text-expected.png',
-            '/test.checkout/LayoutTests/passes/text-expected.txt',
-            '/test.checkout/LayoutTests/passes/text-expected.wav',
+            '/test.checkout/wtests/passes/text-expected.png',
+            '/test.checkout/wtests/passes/text-expected.txt',
+            '/test.checkout/wtests/passes/text-expected.wav',
         ])
 
     def test_unstaged_baselines(self):
diff --git a/third_party/blink/tools/blinkpy/w3c/common_unittest.py b/third_party/blink/tools/blinkpy/w3c/common_unittest.py
index 571435f..5a6e3f40 100644
--- a/third_party/blink/tools/blinkpy/w3c/common_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/common_unittest.py
@@ -6,6 +6,7 @@
 import unittest
 
 from blinkpy.common.host_mock import MockHost
+from blinkpy.common.path_finder import RELATIVE_WEB_TESTS
 from blinkpy.w3c.common import (
     read_credentials,
     is_testharness_baseline,
@@ -116,4 +117,4 @@
             is_file_exportable('third_party/fake/OWNERS')
         # Rejects absolute paths.
         with self.assertRaises(AssertionError):
-            is_file_exportable('/mock-checkout/third_party/WebKit/LayoutTests/external/wpt/OWNERS')
+            is_file_exportable('/mock-checkout/' + RELATIVE_WEB_TESTS + 'external/wpt/OWNERS')
diff --git a/third_party/blink/tools/blinkpy/w3c/directory_owners_extractor_unittest.py b/third_party/blink/tools/blinkpy/w3c/directory_owners_extractor_unittest.py
index e176eb5..453b834 100644
--- a/third_party/blink/tools/blinkpy/w3c/directory_owners_extractor_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/directory_owners_extractor_unittest.py
@@ -78,12 +78,12 @@
             # Although LayoutTests/external/OWNERS exists, it should not be listed.
             ABS_WPT_BASE + '/foo/bar.html': '',
             # Files out of external.
-            '/mock-checkout/third_party/WebKit/LayoutTests/TestExpectations': '',
-            '/mock-checkout/third_party/WebKit/LayoutTests/OWNERS': 'foo@chromium.org',
+            '/mock-checkout/' + RELATIVE_WEB_TESTS + 'TestExpectations': '',
+            '/mock-checkout/' + RELATIVE_WEB_TESTS + 'OWNERS': 'foo@chromium.org',
         })
         changed_files = [
             REL_WPT_BASE + '/foo/bar.html',
-            'third_party/WebKit/LayoutTests/TestExpectations',
+            RELATIVE_WEB_TESTS + 'TestExpectations',
         ]
         self.assertEqual(self.extractor.list_owners(changed_files), {})
 
@@ -124,11 +124,11 @@
 
     def test_find_owners_file_out_of_external(self):
         self._write_files({
-            '/mock-checkout/third_party/WebKit/LayoutTests/OWNERS': 'foo@chromium.org',
-            '/mock-checkout/third_party/WebKit/LayoutTests/other/some_file': '',
+            '/mock-checkout/' + RELATIVE_WEB_TESTS + 'OWNERS': 'foo@chromium.org',
+            '/mock-checkout/' + RELATIVE_WEB_TESTS + 'other/some_file': '',
         })
-        self.assertIsNone(self.extractor.find_owners_file('third_party/WebKit/LayoutTests'))
-        self.assertIsNone(self.extractor.find_owners_file('third_party/WebKit/LayoutTests/other'))
+        self.assertIsNone(self.extractor.find_owners_file(RELATIVE_WEB_TESTS[:-1]))
+        self.assertIsNone(self.extractor.find_owners_file(RELATIVE_WEB_TESTS + 'other'))
         self.assertIsNone(self.extractor.find_owners_file('third_party'))
 
     def test_extract_owners(self):
diff --git a/third_party/blink/tools/blinkpy/w3c/test_importer.py b/third_party/blink/tools/blinkpy/w3c/test_importer.py
index 5e91e4a..2435d64 100644
--- a/third_party/blink/tools/blinkpy/w3c/test_importer.py
+++ b/third_party/blink/tools/blinkpy/w3c/test_importer.py
@@ -564,7 +564,7 @@
 
         This is the same as invoking the `wpt-update-expectations` script.
         """
-        _log.info('Adding test expectations lines to LayoutTests/TestExpectations.')
+        _log.info('Adding test expectations lines to TestExpectations.')
         expectation_updater = WPTExpectationsUpdater(self.host)
         self.rebaselined_tests, self.new_test_expectations = expectation_updater.update_expectations()
 
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py
index 90c3733..ee387a8a 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_expectations_updater_unittest.py
@@ -337,21 +337,21 @@
 
     def test_skipped_specifiers_when_test_is_wontfix(self):
         host = self.mock_host()
-        expectations_path = '/test.checkout/LayoutTests/NeverFixTests'
+        expectations_path = '/test.checkout/wtests/NeverFixTests'
         host.filesystem.write_text_file(
             expectations_path,
             'crbug.com/111 [ Linux ] external/wpt/test.html [ WontFix ]\n')
-        host.filesystem.write_text_file('/test.checkout/LayoutTests/external/wpt/test.html', '')
+        host.filesystem.write_text_file('/test.checkout/wtests/external/wpt/test.html', '')
         updater = WPTExpectationsUpdater(host)
         self.assertEqual(updater.skipped_specifiers('external/wpt/test.html'), ['Precise', 'Trusty'])
 
     def test_specifiers_can_extend_to_all_platforms(self):
         host = self.mock_host()
-        expectations_path = '/test.checkout/LayoutTests/NeverFixTests'
+        expectations_path = '/test.checkout/wtests/NeverFixTests'
         host.filesystem.write_text_file(
             expectations_path,
             'crbug.com/111 [ Linux ] external/wpt/test.html [ WontFix ]\n')
-        host.filesystem.write_text_file('/test.checkout/LayoutTests/external/wpt/test.html', '')
+        host.filesystem.write_text_file('/test.checkout/wtests/external/wpt/test.html', '')
         updater = WPTExpectationsUpdater(host)
         self.assertTrue(updater.specifiers_can_extend_to_all_platforms(
             ['Mac10.10', 'Mac10.11', 'Win7', 'Win10'], 'external/wpt/test.html'))
@@ -387,11 +387,11 @@
 
     def test_specifier_part_with_skipped_test(self):
         host = self.mock_host()
-        expectations_path = '/test.checkout/LayoutTests/NeverFixTests'
+        expectations_path = '/test.checkout/wtests/NeverFixTests'
         host.filesystem.write_text_file(
             expectations_path,
             'crbug.com/111 [ Linux Mac10.11 ] external/wpt/test.html [ WontFix ]\n')
-        host.filesystem.write_text_file('/test.checkout/LayoutTests/external/wpt/test.html', '')
+        host.filesystem.write_text_file('/test.checkout/wtests/external/wpt/test.html', '')
         updater = WPTExpectationsUpdater(host)
         self.assertEqual(
             updater.specifier_part('external/wpt/test.html', ['test-mac-mac10.10', 'test-win-win7', 'test-win-win10']), '')
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
index 7540669..190ab13 100644
--- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
@@ -90,7 +90,7 @@
         comps = [layout_tests_dir] + suite.name.split('/') + ['README.txt']
         path_to_readme = fs.join(*comps)
         if not fs.exists(path_to_readme):
-            failure = 'LayoutTests/%s/README.txt is missing (each virtual suite must have one).' % suite.name
+            failure = '{} is missing (each virtual suite must have one).'.format(path_to_readme)
             _log.error(failure)
             failures.append(failure)
     if failures:
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
index 0e02da86..55952a07 100644
--- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
@@ -139,7 +139,7 @@
 
         host.port_factory.get = lambda platform, options=None: port
         host.port_factory.all_port_names = lambda platform=None: [port.name()]
-        host.filesystem.write_text_file('/test.checkout/LayoutTests/LeakExpectations', '-- syntax error')
+        host.filesystem.write_text_file('/test.checkout/wtests/LeakExpectations', '-- syntax error')
 
         res = lint_test_expectations.lint(host, options)
 
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py
index ff92d5a1..530236e 100644
--- a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py
@@ -297,6 +297,8 @@
                           '/out-of-checkout/TestExpectations')
         self.assertEquals(expectations._shorten_filename('/mock-checkout/third_party/WebKit/LayoutTests/TestExpectations'),
                           'third_party/WebKit/LayoutTests/TestExpectations')
+        self.assertEquals(expectations._shorten_filename('/mock-checkout/third_party/blink/web_tests/TestExpectations'),
+                          'third_party/blink/web_tests/TestExpectations')
 
 class SkippedTests(Base):
 
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base.py b/third_party/blink/tools/blinkpy/web_tests/port/base.py
index 94ae83b1..1d982409 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/base.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -1601,10 +1601,12 @@
                 for json_config in test_suite_json:
                     vts = VirtualTestSuite(**json_config)
                     if vts in self._virtual_test_suites:
-                        raise ValueError('LayoutTests/VirtualTestSuites contains duplicate definition: %r' % json_config)
+                        raise ValueError('{} contains duplicate definition: {!r}'.format(
+                            path_to_virtual_test_suites, json_config))
                     self._virtual_test_suites.append(vts)
             except ValueError as error:
-                raise ValueError('LayoutTests/VirtualTestSuites is not a valid JSON file: %s' % error)
+                raise ValueError('{} is not a valid JSON file: {}'.format(
+                    path_to_virtual_test_suites, error))
         return self._virtual_test_suites
 
     def _all_virtual_tests(self, suites):
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/test.py b/third_party/blink/tools/blinkpy/web_tests/port/test.py
index 35ad88b8..4c8cfdf5 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/test.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/test.py
@@ -40,7 +40,7 @@
 # Here we use a non-standard location for the layout tests, to ensure that
 # this works. The path contains a '.' in the name because we've seen bugs
 # related to this before.
-LAYOUT_TEST_DIR = '/test.checkout/LayoutTests'
+LAYOUT_TEST_DIR = '/test.checkout/wtests'
 PERF_TEST_DIR = '/test.checkout/PerformanceTests'
 
 
diff --git a/third_party/blink/tools/blinkpy/web_tests/servers/wptserve_unittest.py b/third_party/blink/tools/blinkpy/web_tests/servers/wptserve_unittest.py
index 5ccc720..b1d77eb 100644
--- a/third_party/blink/tools/blinkpy/web_tests/servers/wptserve_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/servers/wptserve_unittest.py
@@ -36,7 +36,7 @@
                 '--config',
                 server._config_file,
                 '--doc_root',
-                '/test.checkout/LayoutTests/external/wpt'
+                '/test.checkout/wtests/external/wpt'
             ])
 
     def test_init_gen_config(self):
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 4aef9c3..ff1f339 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -7718,7 +7718,7 @@
   <int value="2" label="Downloads"/>
   <int value="3" label="Bookmarks"/>
   <int value="4" label="Physical Web Pages (obsolete)"/>
-  <int value="5" label="Foreign Tabs"/>
+  <int value="5" label="Foreign Tabs (obsolete)"/>
   <int value="6" label="Articles"/>
 </enum>
 
@@ -12409,6 +12409,12 @@
   <int value="7" label="Iterator error"/>
 </enum>
 
+<enum name="DriveMountStatus">
+  <int value="0" label="Success"/>
+  <int value="1" label="UnknownFailure"/>
+  <int value="2" label="TemporaryUnavailable"/>
+</enum>
+
 <enum name="DriveUploadProtocol">
   <int value="0" label="Resumable"/>
   <int value="1" label="Multipart"/>
@@ -21316,6 +21322,12 @@
   <int value="6" label="Error"/>
 </enum>
 
+<enum name="FileManagerCrostiniShareDialogType">
+  <int value="0" label="None"/>
+  <int value="1" label="Share before open"/>
+  <int value="2" label="Unable to open"/>
+</enum>
+
 <enum name="FileManagerListType">
   <int value="0" label="Uninitialized"/>
   <int value="1" label="List view (detail)"/>
@@ -21335,6 +21347,7 @@
   <int value="9" label="Toggle Show Google Docs files (off)"/>
   <int value="10" label="Toggle show hidden Android folders (on)"/>
   <int value="11" label="Toggle show hidden Android folders (off)"/>
+  <int value="12" label="Share with Linux"/>
 </enum>
 
 <enum name="FileManagerQuickViewWayToOpen">
@@ -33681,6 +33694,13 @@
   <int value="10" label="FAILED_TO_FIND_NAMESPACE"/>
 </enum>
 
+<enum name="NativeSmbFileShare_AuthMethod">
+  <int value="0" label="No Credentials."/>
+  <int value="1" label="Username only."/>
+  <int value="2" label="Username and password."/>
+  <int value="3" label="SSO kerberos."/>
+</enum>
+
 <enum name="NativeSmbFileShare_MountResult">
   <int value="0" label="Succeeded"/>
   <int value="1" label="Unknown failure"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 67401be..b4e3efc 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -14567,8 +14567,8 @@
 </histogram>
 
 <histogram name="ContentSettings.EphemeralFlashPermission"
-    enum="ContentSettings.EphemeralFlashPermission" expires_after="M71">
-  <owner>rhalavati@chromium.org</owner>
+    enum="ContentSettings.EphemeralFlashPermission" expires_after="M87">
+  <owner>engedy@chromium.org</owner>
   <summary>
     Records the number of times Flash permission is granted for a host.
   </summary>
@@ -15762,6 +15762,24 @@
   </summary>
 </histogram>
 
+<histogram name="Cras.HighestInputHardwareLevel" units="frames">
+  <owner>yuhsuan@chromium.org</owner>
+  <summary>
+    The highest hardware level of input device in CRAS(Chrome OS audio server).
+    The hardware level is the remaining frames in the device. For input device,
+    it can show the latency between capturing and actual reading.
+  </summary>
+</histogram>
+
+<histogram name="Cras.HighestOutputHardwareLevel" units="frames">
+  <owner>yuhsuan@chromium.org</owner>
+  <summary>
+    The highest hardware level of output device in CRAS(Chrome OS audio server).
+    The hardware level is the remaining frames in the device. For output device,
+    it can show the latency between writing and actual playout.
+  </summary>
+</histogram>
+
 <histogram name="Cras.StreamCallbackThreshold" units="frames">
   <owner>yuhsuan@chromium.org</owner>
   <summary>
@@ -23454,6 +23472,75 @@
   </summary>
 </histogram>
 
+<histogram name="DriveCommon.Lifecycle.FirstLaunchTime" units="ms">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>
+    How long did it take to launch Google Drive for the first time.
+  </summary>
+</histogram>
+
+<histogram name="DriveCommon.Lifecycle.Mount" enum="DriveMountStatus">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>Records outcomes of attempts to mount Google Drive.</summary>
+</histogram>
+
+<histogram name="DriveCommon.Lifecycle.MountTime" units="ms">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>How long did it take to mount Google Drive.</summary>
+</histogram>
+
+<histogram name="DriveCommon.Lifecycle.Unmount" enum="DriveMountStatus">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>Records outcomes of attempts to unmount Google Drive.</summary>
+</histogram>
+
+<histogram name="DriveCommon.LocalSearch.OfflineSearchTime" units="ms">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>
+    How long did it take to perform a lookup of pinned files in local Google
+    Drive cache.
+  </summary>
+</histogram>
+
+<histogram name="DriveCommon.LocalSearch.SharedSearchTime" units="ms">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>
+    How long did it take to perform a search of shared files in local Google
+    Drive cache.
+  </summary>
+</histogram>
+
+<histogram name="DriveCommon.LocalSearch.TextSearchTime" units="ms">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>
+    How long did it take to search a title in local Google Drive cache.
+  </summary>
+</histogram>
+
+<histogram name="DriveCommon.RemoteSearch.SharedSearchTime" units="ms">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>
+    How long did it take to perform a search of shared files in online Google
+    Drive.
+  </summary>
+</histogram>
+
+<histogram name="DriveCommon.RemoteSearch.TextSearchTime" units="ms">
+  <owner>dats@chromium.org</owner>
+  <owner>sammc@chromium.org</owner>
+  <summary>
+    How long did it take to perform a search in online Google Drive.
+  </summary>
+</histogram>
+
 <histogram name="DriveOffline.CrosAutoEnableOutcome"
     enum="CrosEnableDriveOfflineOutcome">
   <owner>joshwoodward@google.com</owner>
@@ -32522,6 +32609,24 @@
   <summary>Chrome OS File Browser opening mode.</summary>
 </histogram>
 
+<histogram name="FileBrowser.CrostiniShareDialog"
+    enum="FileManagerCrostiniShareDialogType" expires_after="2019-10-01">
+  <owner>joelhockey@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>Dialog shown when using crostini app to open a file.</summary>
+</histogram>
+
+<histogram base="true" name="FileBrowser.CrostiniSharedPaths.Depth"
+    units="depth" expires_after="2019-10-01">
+  <owner>joelhockey@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    The depth from volume root of the path being shared. This is equivalent to
+    how many '/' are in the path. E.g. 'Downloads' or 'My Drive' has depth 0.
+    'Downloads/foo/bar' has depth 2.
+  </summary>
+</histogram>
+
 <histogram name="FileBrowser.DirectoryScan" units="ms">
   <owner>sashab@chromium.org</owner>
   <owner>slangley@chromium.org</owner>
@@ -50053,6 +50158,15 @@
   </summary>
 </histogram>
 
+<histogram name="NativeSmbFileShare.AuthenticationMethod"
+    enum="NativeSmbFileShare_AuthMethod">
+  <owner>zentaro@chromium.org</owner>
+  <summary>
+    The method used to authenticate to a share. This is called on each attempted
+    mount.
+  </summary>
+</histogram>
+
 <histogram name="NativeSmbFileShare.MountCount">
   <owner>zentaro@chromium.org</owner>
   <summary>
@@ -124304,6 +124418,17 @@
   <affected-histogram name="Compositing.Display.Draw.Quads"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="DriveCommonTimings" separator=".">
+  <suffix name="FailTime"/>
+  <suffix name="SuccessTime"/>
+  <affected-histogram name="DriveCommon.Lifecycle.MountTime"/>
+  <affected-histogram name="DriveCommon.LocalSearch.OfflineSearchTime"/>
+  <affected-histogram name="DriveCommon.LocalSearch.SharedSearchTime"/>
+  <affected-histogram name="DriveCommon.LocalSearch.TextSearchTime"/>
+  <affected-histogram name="DriveCommon.RemoteSearch.SharedSearchTime"/>
+  <affected-histogram name="DriveCommon.RemoteSearch.TextSearchTime"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="DualCertVerifierTrial" separator="_">
   <suffix name="TrialPrimary"/>
   <suffix name="TrialSecondary"/>
@@ -124575,6 +124700,13 @@
   <affected-histogram name="Autofill.Quality.ServerType.ByFieldType"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="FileBrowserCrostiniSharedPathsDepth" separator=".">
+  <suffix name="downloads" label="Shared path in Downloads volume."/>
+  <suffix name="drive" label="Shared path in Drive volume."/>
+  <suffix name="other" label="Shared path in any other volume."/>
+  <affected-histogram name="FileBrowser.CrostiniSharedPaths.Depth"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="FileBrowserLoad" separator=".">
   <suffix name="BackgroundLaunch"
       label="Time from onLaunched event is called to the window is created."/>
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index e0d766f..9ec936f6 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -280,6 +280,7 @@
 crbug.com/883652 [ Android_One ] system_health.memory_mobile/browse:news:cnn [ Skip ]
 crbug.com/883652 [ Android_One ] system_health.memory_mobile/browse:news:toi [ Skip ]
 crbug.com/883652 [ Nexus_5 ] system_health.memory_mobile/browse:shopping:avito [ Skip ]
+crbug.com/893873 [ Nexus_5X ] system_health.memory_mobile/load:news:washingtonpost [ Skip ]
 
 # Benchmark: tab_switching.typical_25
 crbug.com/747026 [ Mac ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
diff --git a/tools/perf/page_sets/data/system_health_desktop.json b/tools/perf/page_sets/data/system_health_desktop.json
index b9e9c35..dfa2eff9 100644
--- a/tools/perf/page_sets/data/system_health_desktop.json
+++ b/tools/perf/page_sets/data/system_health_desktop.json
@@ -144,6 +144,9 @@
         "load:news:cnn": {
             "DEFAULT": "system_health_desktop_006.wprgo"
         },
+        "load:news:cnn:2018": {
+            "DEFAULT": "system_health_desktop_3c603ac582.wprgo"
+        },
         "load:news:flipboard": {
             "DEFAULT": "system_health_desktop_020.wprgo"
         },
diff --git a/tools/perf/page_sets/data/system_health_desktop_3c603ac582.wprgo.sha1 b/tools/perf/page_sets/data/system_health_desktop_3c603ac582.wprgo.sha1
new file mode 100644
index 0000000..00bced9
--- /dev/null
+++ b/tools/perf/page_sets/data/system_health_desktop_3c603ac582.wprgo.sha1
@@ -0,0 +1 @@
+3c603ac582f0c1c91a418af4f6cc5db4752d42d1
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/system_health_mobile.json b/tools/perf/page_sets/data/system_health_mobile.json
index 5b3c70b2..3cdbffa7 100644
--- a/tools/perf/page_sets/data/system_health_mobile.json
+++ b/tools/perf/page_sets/data/system_health_mobile.json
@@ -147,6 +147,9 @@
         "load:news:cnn": {
             "DEFAULT": "system_health_mobile_006.wprgo"
         },
+        "load:news:cnn:2018": {
+            "DEFAULT": "system_health_mobile_f70e9f436d.wprgo"
+        },
         "load:news:flipboard": {
             "DEFAULT": "system_health_mobile_024.wprgo"
         },
diff --git a/tools/perf/page_sets/data/system_health_mobile_f70e9f436d.wprgo.sha1 b/tools/perf/page_sets/data/system_health_mobile_f70e9f436d.wprgo.sha1
new file mode 100644
index 0000000..8e15412
--- /dev/null
+++ b/tools/perf/page_sets/data/system_health_mobile_f70e9f436d.wprgo.sha1
@@ -0,0 +1 @@
+f70e9f436d95b08f747a3380fd513e59e80975c6
\ No newline at end of file
diff --git a/tools/perf/page_sets/system_health/loading_stories.py b/tools/perf/page_sets/system_health/loading_stories.py
index 9c01454..e37b50b 100644
--- a/tools/perf/page_sets/system_health/loading_stories.py
+++ b/tools/perf/page_sets/system_health/loading_stories.py
@@ -177,6 +177,12 @@
   TAGS = [story_tags.JAVASCRIPT_HEAVY, story_tags.YEAR_2016]
 
 
+class LoadCnnStory2018(_LoadingStory):
+  NAME = 'load:news:cnn:2018'
+  URL = 'https://edition.cnn.com'
+  TAGS = [story_tags.JAVASCRIPT_HEAVY, story_tags.YEAR_2018]
+
+
 class LoadFlipboardDesktopStory(_LoadingStory):
   NAME = 'load:news:flipboard'
   URL = 'https://flipboard.com/explore'
diff --git a/ui/file_manager/file_manager/foreground/js/crostini.js b/ui/file_manager/file_manager/foreground/js/crostini.js
index ec49d543..670519b97 100644
--- a/ui/file_manager/file_manager/foreground/js/crostini.js
+++ b/ui/file_manager/file_manager/foreground/js/crostini.js
@@ -11,6 +11,19 @@
 Crostini.IS_CROSTINI_FILES_ENABLED = false;
 
 /**
+ * Keep in sync with histograms.xml:FileBrowserCrostiniSharedPathsDepth
+ * histogram_suffix.
+ * @private {!Array<VolumeManagerCommon.RootType>}
+ */
+Crostini.UMA_VALID_ROOT_TYPES = [
+  VolumeManagerCommon.RootType.DOWNLOADS,
+  VolumeManagerCommon.RootType.DRIVE,
+];
+
+/** @private {string} */
+Crostini.UMA_ROOT_TYPE_OTHER = 'other';
+
+/**
  * Maintains a list of paths shared with the crostini container.
  * Keyed by VolumeManagerCommon.RootType, with boolean set values
  * of string paths.  e.g. {'Downloads': {'/foo': true, '/bar': true}}.
@@ -33,6 +46,14 @@
     Crostini.SHARED_PATHS_[info.rootType] = paths;
   }
   paths[entry.fullPath] = true;
+
+  // Record UMA.
+  let suffix = info.rootType;
+  if (!Crostini.UMA_VALID_ROOT_TYPES.includes(info.rootType))
+    suffix = Crostini.UMA_ROOT_TYPE_OTHER;
+  metrics.recordSmallCount(
+      'CrostiniSharedPaths.Depth.' + suffix,
+      entry.fullPath.split('/').length - 1);
 };
 
 /**
diff --git a/ui/file_manager/file_manager/foreground/js/crostini_unittest.js b/ui/file_manager/file_manager/foreground/js/crostini_unittest.js
index 6d8d893b1..374657f 100644
--- a/ui/file_manager/file_manager/foreground/js/crostini_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/crostini_unittest.js
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+window.metrics = {
+  recordSmallCount: function() {},
+};
+
 const volumeManagerTest = {
   getLocationInfo: (entry) => {
     return {rootType: 'testroot'};
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
index 5e1700b..f8ddc3a 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -394,6 +394,7 @@
   SHOW_GOOGLE_DOCS_FILES_ON: 'drive-hosted-settings-enabled',
   HIDDEN_ANDROID_FOLDERS_SHOW: 'toggle-hidden-android-folders-on',
   HIDDEN_ANDROID_FOLDERS_HIDE: 'toggle-hidden-android-folders-off',
+  SHARE_WITH_LINUX: 'share-with-linux',
 };
 
 /**
@@ -418,6 +419,7 @@
   CommandHandler.MenuCommandsForUMA.SHOW_GOOGLE_DOCS_FILES_OFF,
   CommandHandler.MenuCommandsForUMA.HIDDEN_ANDROID_FOLDERS_SHOW,
   CommandHandler.MenuCommandsForUMA.HIDDEN_ANDROID_FOLDERS_HIDE,
+  CommandHandler.MenuCommandsForUMA.SHARE_WITH_LINUX,
 ];
 console.assert(
     Object.keys(CommandHandler.MenuCommandsForUMA).length ===
@@ -1653,6 +1655,8 @@
               Crostini.registerSharedPath(dir, fileManager.volumeManager);
             }
           });
+      CommandHandler.recordMenuItemSelected_(
+          CommandHandler.MenuCommandsForUMA.SHARE_WITH_LINUX);
     }
   },
   /**
diff --git a/ui/file_manager/file_manager/foreground/js/file_tasks.js b/ui/file_manager/file_manager/foreground/js/file_tasks.js
index 8d8e34c..e99eacd 100644
--- a/ui/file_manager/file_manager/foreground/js/file_tasks.js
+++ b/ui/file_manager/file_manager/foreground/js/file_tasks.js
@@ -377,6 +377,39 @@
 };
 
 /**
+ * Crostini Share Dialog types.
+ * Keep in sync with enums.xml FileManagerCrostiniShareDialogType.
+ * @enum {string}
+ */
+FileTasks.CrostiniShareDialogType = {
+  None: 'None',
+  ShareBeforeOpen: 'ShareBeforeOpen',
+  UnableToOpen: 'UnableToOpen',
+};
+
+/**
+ * The indexes of these types must match with the values of
+ * FileManagerCrostiniShareDialogType in enums.xml, and should not change.
+ */
+FileTasks.UMA_CROSTINI_SHARE_DIALOG_TYPES_ = Object.freeze([
+  FileTasks.CrostiniShareDialogType.None,
+  FileTasks.CrostiniShareDialogType.ShareBeforeOpen,
+  FileTasks.CrostiniShareDialogType.UnableToOpen,
+]);
+
+
+/**
+ * Records the type of dialog shown when using a crostini app to open a file.
+ * @param {!FileTasks.CrostiniShareDialogType} dialogType
+ * @private
+ */
+FileTasks.recordCrostiniShareDialogTypeUMA_ = function(dialogType) {
+  metrics.recordEnum(
+      'CrostiniShareDialog', dialogType,
+      FileTasks.UMA_CROSTINI_SHARE_DIALOG_TYPES_);
+};
+
+/**
  * Returns true if the taskId is for an internal task.
  *
  * @param {string} taskId Task identifier.
@@ -556,6 +589,8 @@
     this.ui_.alertDialog.showHtml(
         strf('UNABLE_TO_OPEN_CROSTINI_TITLE', task.title),
         strf('UNABLE_TO_OPEN_CROSTINI', task.title));
+    FileTasks.recordCrostiniShareDialogTypeUMA_(
+        FileTasks.CrostiniShareDialogType.UnableToOpen);
     return true;
   }
 
@@ -571,10 +606,14 @@
                 'SHARE_BEFORE_OPEN_CROSTINI_SINGLE',
                 `<b>${firstEntryNotShared.name}</b>`),
         this.sharePathWithCrostiniAndExecute_.bind(this, task), () => {});
+    FileTasks.recordCrostiniShareDialogTypeUMA_(
+        FileTasks.CrostiniShareDialogType.ShareBeforeOpen);
     return true;
   }
 
   // No dialogs.
+  FileTasks.recordCrostiniShareDialogTypeUMA_(
+      FileTasks.CrostiniShareDialogType.None);
   return false;
 };
 
@@ -592,11 +631,7 @@
                 'Error sharing with linux to execute: ' +
                 chrome.runtime.lastError.message);
           } else {
-            // Register path as shared, and execute. This will be the 2nd
-            // time we have gone through executeInternal_().  The first time,
-            // we showed the share dialog, and did not execute, now we
-            // should detect that paths are already shared, and it is OK to
-            // execute.
+            // Register path as shared, and now we are ready to execute.
             Crostini.registerSharedPath(dir, this.volumeManager_);
             this.executeInternal_(task);
           }
@@ -633,6 +668,8 @@
   var callback = opt_callback || function(arg1, arg2) {};
 
   if (this.defaultTask_ !== null) {
+    if (this.maybeShowCrostiniShareDialog_(this.defaultTask_))
+      return;
     this.executeInternal_(this.defaultTask_);
     callback(true, this.entries_);
     return;
@@ -754,6 +791,8 @@
   FileTasks.recordViewingFileTypeUMA_(this.entries_);
   FileTasks.recordViewingRootTypeUMA_(
       this.directoryModel_.getCurrentRootType());
+  if (this.maybeShowCrostiniShareDialog_(task))
+    return;
   this.executeInternal_(task);
 };
 
@@ -768,8 +807,6 @@
     this.taskHistory_.recordTaskExecuted(task.taskId);
     if (FileTasks.isInternalTask_(task.taskId)) {
       this.executeInternalTask_(task.taskId);
-    } else if (this.maybeShowCrostiniShareDialog_(task)) {
-      // Nothing to do, dialog will be shown.
     } else {
       FileTasks.recordZipHandlerUMA_(task.taskId);
       chrome.fileManagerPrivate.executeTask(
diff --git a/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js b/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js
index 2fd804d..386962c 100644
--- a/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/file_tasks_unittest.js
@@ -3,7 +3,8 @@
 // found in the LICENSE file.
 
 window.metrics = {
-  recordEnum: function() {}
+  recordEnum: function() {},
+  recordSmallCount: function() {},
 };
 
 var mockTaskHistory = {
diff --git a/ui/file_manager/file_manager/test/crostini.js b/ui/file_manager/file_manager/test/crostini.js
index cde9238..086946a 100644
--- a/ui/file_manager/file_manager/test/crostini.js
+++ b/ui/file_manager/file_manager/test/crostini.js
@@ -167,6 +167,7 @@
     executeTaskCalled = true;
     oldExecuteTask(taskId, entries, callback);
   };
+  chrome.metricsPrivate.values_ = [];
 
   test.setupAndWaitUntilReady([], [], [])
       .then(() => {
@@ -225,6 +226,12 @@
         });
       })
       .then(() => {
+        // Validate UMAs.
+        const lastEnumUma = chrome.metricsPrivate.values_.pop();
+        assertEquals(
+            'FileBrowser.CrostiniShareDialog', lastEnumUma[0].metricName);
+        assertEquals(1 /* ShareBeforeOpen */, lastEnumUma[1]);
+
         // Restore fmp.*.
         chrome.fileManagerPrivate.getFileTasks = oldGetFileTasks;
         chrome.fileManagerPrivate.sharePathWithCrostini = oldSharePath;
@@ -288,9 +295,14 @@
   const oldSharePath = chrome.fileManagerPrivate.sharePathWithCrostini;
   let sharePathCalled = false;
   chrome.fileManagerPrivate.sharePathWithCrostini = (entry, callback) => {
-    sharePathCalled = true;
-    oldSharePath(entry, callback);
+    oldSharePath(entry, () => {
+      sharePathCalled = true;
+      callback();
+    });
   };
+  chrome.metricsPrivate.smallCounts_ = [];
+  chrome.metricsPrivate.values_ = [];
+
   test.setupAndWaitUntilReady()
       .then(() => {
         // Right-click 'photos' directory.
@@ -308,11 +320,22 @@
             test.fakeMouseClick(
                 '#file-context-menu [command="#share-with-linux"]'),
             'Share with Linux');
-        return test.waitForElement('#file-context-menu[hidden]');
+        // Check sharePathWithCrostini is called.
+        return test.repeatUntil(() => {
+          return sharePathCalled || test.pending('wait for sharePathCalled');
+        });
       })
       .then(() => {
-        // Check sharePathWithCrostini is called.
-        assertTrue(sharePathCalled);
+        // Validate UMAs.
+        assertEquals(1, chrome.metricsPrivate.smallCounts_.length);
+        assertArrayEquals(
+            ['FileBrowser.CrostiniSharedPaths.Depth.downloads', 1],
+            chrome.metricsPrivate.smallCounts_[0]);
+        const lastEnumUma = chrome.metricsPrivate.values_.pop();
+        assertEquals('FileBrowser.MenuItemSelected', lastEnumUma[0].metricName);
+        assertEquals(12 /* Share with Linux */, lastEnumUma[1]);
+
+        // Restore fmp.*.
         chrome.fileManagerPrivate.sharePathWithCrostini = oldSharePath;
         done();
       });
diff --git a/ui/file_manager/file_manager/test/js/chrome_api_test_impl.js b/ui/file_manager/file_manager/test/js/chrome_api_test_impl.js
index 1ec1954..c71cf7c3 100644
--- a/ui/file_manager/file_manager/test/js/chrome_api_test_impl.js
+++ b/ui/file_manager/file_manager/test/js/chrome_api_test_impl.js
@@ -95,20 +95,26 @@
 
   metricsPrivate: {
     userActions_: [],
+    smallCounts_: [],
     times_: [],
+    values_: [],
     MetricTypeType: {
       HISTOGRAM_LINEAR: 'histogram-linear',
     },
     recordMediumCount: () => {},
     recordPercentage: () => {},
-    recordSmallCount: () => {},
+    recordSmallCount: (metricName, value) => {
+      chrome.metricsPrivate.smallCounts_.push([metricName, value]);
+    },
     recordTime: (metricName, value) => {
       chrome.metricsPrivate.times_.push([metricName, value]);
     },
     recordUserAction: (action) => {
       chrome.metricsPrivate.userActions_.push(action);
     },
-    recordValue: () => {},
+    recordValue: (metricName, value) => {
+      chrome.metricsPrivate.values_.push([metricName, value]);
+    },
   },
 
   notifications: {
diff --git a/ui/file_manager/integration_tests/file_manager/quick_view.js b/ui/file_manager/integration_tests/file_manager/quick_view.js
index d794858..1f15419 100644
--- a/ui/file_manager/integration_tests/file_manager/quick_view.js
+++ b/ui/file_manager/integration_tests/file_manager/quick_view.js
@@ -305,6 +305,59 @@
 };
 
 /**
+ * Tests opening Quick View on an Android file.
+ */
+testcase.openQuickViewAndroid = function() {
+  let appId;
+
+  StepsRunner.run([
+    // Open Files app on Android files.
+    function() {
+      openNewWindow(null, RootPath.ANDROID_FILES).then(this.next);
+    },
+    // Add files to the Android files volume.
+    function(result) {
+      appId = result;
+      const entrySet = BASIC_ANDROID_ENTRY_SET.concat([ENTRIES.documentsText]);
+      addEntries(['android_files'], entrySet, this.next);
+    },
+    // Wait for the file list to appear.
+    function(result) {
+      chrome.test.assertTrue(result);
+      remoteCall.waitForElement(appId, '#file-list').then(this.next);
+    },
+    // Check: the basic Android file set should appear in the file list.
+    function() {
+      const files = TestEntryInfo.getExpectedRows(BASIC_ANDROID_ENTRY_SET);
+      remoteCall.waitForFiles(appId, files, {ignoreLastModifiedTime: true})
+          .then(this.next);
+    },
+    // Navigate to the Android files '/Documents' directory.
+    function() {
+      remoteCall
+          .navigateWithDirectoryTree(
+              appId, '/Documents', 'My files/Play files', 'android_files')
+          .then(this.next);
+    },
+    // Check: the 'android.txt' file should appear in the file list.
+    function() {
+      const files = [ENTRIES.documentsText.getExpectedRow()];
+      remoteCall.waitForFiles(appId, files, {ignoreLastModifiedTime: true})
+          .then(this.next);
+    },
+    // Open the Android file in Quick View.
+    function() {
+      const documentsFileName = ENTRIES.documentsText.nameText;
+      const openSteps = openQuickViewSteps(appId, documentsFileName);
+      StepsRunner.run(openSteps).then(this.next);
+    },
+    function() {
+      checkIfNoErrorsOccured(this.next);
+    },
+  ]);
+};
+
+/**
  * Tests opening Quick View and scrolling its <webview> which contains a tall
  * text document.
  */
diff --git a/ui/file_manager/integration_tests/test_util.js b/ui/file_manager/integration_tests/test_util.js
index 404376e..96a0d01 100644
--- a/ui/file_manager/integration_tests/test_util.js
+++ b/ui/file_manager/integration_tests/test_util.js
@@ -872,6 +872,17 @@
     },
   }),
 
+  documentsText: new TestEntryInfo({
+    type: EntryType.FILE,
+    sourceFileName: 'text.txt',
+    targetPath: 'Documents/android.txt',
+    mimeType: 'text/plain',
+    lastModifiedTime: 'Sep 4, 1998, 12:34 PM',
+    nameText: 'android.txt',
+    sizeText: '51 bytes',
+    typeText: 'Plain text',
+  }),
+
   neverSync: new TestEntryInfo({
     type: EntryType.FILE,
     sourceFileName: 'text.txt',
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc
index c27bfd9..b46099c 100644
--- a/ui/message_center/views/notification_view_md.cc
+++ b/ui/message_center/views/notification_view_md.cc
@@ -36,6 +36,7 @@
 #include "ui/strings/grit/ui_strings.h"
 #include "ui/views/animation/flood_fill_ink_drop_ripple.h"
 #include "ui/views/animation/ink_drop_highlight.h"
+#include "ui/views/animation/ink_drop_mask.h"
 #include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
@@ -1237,6 +1238,8 @@
   action_buttons_row_->SetBackground(views::CreateBackgroundFromPainter(
       std::make_unique<NotificationBackgroundPainter>(
           0, bottom_radius, kActionsRowBackgroundColor)));
+  top_radius_ = top_radius;
+  bottom_radius_ = bottom_radius;
 }
 
 NotificationControlButtonsView* NotificationViewMD::GetControlButtonsView()
@@ -1343,6 +1346,16 @@
       GetInkDropBaseColor(), ink_drop_visible_opacity());
 }
 
+std::unique_ptr<views::InkDropMask> NotificationViewMD::CreateInkDropMask()
+    const {
+  gfx::Path path;
+  SkScalar radii[8] = {top_radius_,    top_radius_,    top_radius_,
+                       top_radius_,    bottom_radius_, bottom_radius_,
+                       bottom_radius_, bottom_radius_};
+  path.addRoundRect(gfx::RectToSkRect(gfx::Rect(size())), radii);
+  return std::make_unique<views::PathInkDropMask>(size(), path);
+}
+
 SkColor NotificationViewMD::GetInkDropBaseColor() const {
   return kSettingsRowBackgroundColor;
 }
diff --git a/ui/message_center/views/notification_view_md.h b/ui/message_center/views/notification_view_md.h
index 4ead77e..87ffbfe 100644
--- a/ui/message_center/views/notification_view_md.h
+++ b/ui/message_center/views/notification_view_md.h
@@ -182,6 +182,7 @@
   void AddInkDropLayer(ui::Layer* ink_drop_layer) override;
   void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override;
   std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override;
+  std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override;
   SkColor GetInkDropBaseColor() const override;
 
   // Overridden from MessageView:
@@ -265,6 +266,9 @@
   // Describes whether the view should display a hand pointer or not.
   bool clickable_;
 
+  int top_radius_ = 0;
+  int bottom_radius_ = 0;
+
   // Container views directly attached to this view.
   NotificationHeaderView* header_row_ = nullptr;
   views::View* content_row_ = nullptr;
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
index c88e37f..18539d6 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.js
@@ -203,6 +203,7 @@
             }
 
             this.visiblePageName_ = PageName.SUCCESS;
+            this.fire('forward-button-focus-requested');
           })
           .catch((error) => {
             console.warn('Mojo service failure: ' + error);